PyFAI is a powerful library developed at the ESRF for reduction of 2D powder diffraction images. If you have DAWN and PyFAI installed on your computer it is possible to use the calibration metadata produced by DAWN with the integration routines in PYFAI.
Assuming you already have a python interpreter and PyFAI already installed.
Assuming you have a NeXus file from DAWN containing the calibration metadata, the following lines of code can be used to construct a PyFAI azimuthal integrator object.
import pyFAI import scisoftpy as dnp import scisoftpy.io as dio ai = pyFAI.AzimuthalIntegrator() nexusFile = dio.load("/path/to/calibration/nexus/file.nxs") #Load geometry and energy into PyFAI px = nexusFile['/entry1/instrument/detector/detector_module/fast_pixel_direction'][...] bc = [nexusFile['/entry1/instrument/detector/beam_center_x'][...], nexusFile['/entry1/instrument/detector/beam_center_y'][...]] distance = nexusFile['/entry1/instrument/detector/distance'][...] wavelength = nexusFile['/entry1/calibration_sample/beam/incident_wavelength'][...] px = nexusFile['/entry1/instrument/detector/detector_module/fast_pixel_direction'][...] eub = nexusFile['/entry1/instrument/detector/transformations/euler_b'][...] euc = nexusFile['/entry1/instrument/detector/transformations/euler_c'][...] #set ai.setFit2D(distance, bc[0]/px, bc[1]/px, eub, euc, px*1000., px*1000.0, None) ai.set_wavelength(wavelength*10e-10); ai.set_wavelength(energy); |
The azimuthal integrator object (ai) can then be used to integrate your powder images.
Assuming you have a NeXus file from DAWN containing the calibration metadata, the following lines of code can be used to construct a PyFAI azimuthal integrator object.
import pyFAI import scisoftpy as dnp import scisoftpy.io as dio ai = pyFAI.AzimuthalIntegrator() nexusFile = dio.load("/path/to/calibration/nexus/file.nxs") #Load geometry and energy into PyFAI bc = [nexusFile['/entry/instrument/detector/beam_center_x'][...], nexusFile['/entry/instrument/detector/beam_center_y'][...]] distance = nexusFile['/entry/instrument/detector/distance'][...] energy = nexusFile['/entry/calibration_sample/beam/incident_wavelength'][...][0] px = nexusFile['/entry/instrument/detector/x_pixel_size'][...]*1000 orien = nexusFile['/entry/instrument/detector/detector_orientation'][...].reshape((3,3)) #Transform yaw = math.degrees(-math.atan2(orien[2,0], orien[2,2])) roll = math.degrees(-math.atan2(orien[0,1], orien[1,1])) #set ai.setFit2D(distance, bc[0],bc[1], -yaw, roll, px, px, None) ai.set_wavelength(energy); |
The azimuthal integrator object (ai) can then be used to integrate your powder images.