Source code for paws.core.operations.IO.CALIBRATION.NikaToPONI
from __future__ import print_function
from collections import OrderedDict
import os
import numpy as np
import pyFAI
from ... import Operation as opmod
from ...Operation import Operation
inputs=OrderedDict(file_path=None)
outputs=OrderedDict(poni_dict=None)
[docs]class NikaToPONI(Operation):
"""
Converts Nika calibration output
(saved in a text file)
to a dict of PyFAI PONI parameters,
by first converting from Nika to Fit2D,
then using a pyFAI.AzimuthalIntegrator
to convert from Fit2D to PONI format.
WARNING: the map from Nika's horizontal and vertical tilts
to Fit2D's tilt and tiltPlanRotation
has not yet been verified by the developers.
Use this operation with nonzero tilts at your own risk.
Input a text file expressing results of Nika automated calibration.
Output a dict of pyFAI PONI calibration parameters.
Format of text file for Nika output is expected to be:
sample_to_CCD_mm=____
pixel_size_x_mm=____
pixel_size_y_mm=____
beam_center_x_pix=____
beam_center_y_pix=____
horizontal_tilt_deg=____
vertical_tilt_deg=____
wavelength_A=____
"""
def __init__(self):
super(NikaToPONI,self).__init__(inputs,outputs)
self.input_doc['file_path'] = 'text file expressing nika automated calibration results- '\
'see documentation of this operation class for the expected format of this file'
self.output_doc['poni_dict'] = 'Dict of pyFAI calibration parameters, as found in a .poni file'
[docs] def run(self):
fpath = self.inputs['file_path']
for line in open(fpath,'r'):
kv = line.strip().split('=')
if 'sample_to_CCD_mm' in kv[0]:
d_mm = float(kv[1])
if 'pixel_size_x_mm' in kv[0]:
pxsz_x_mm = float(kv[1])
if 'pixel_size_y_mm' in kv[0]:
pxsz_y_mm = float(kv[1])
if 'beam_center_x_pix' in kv[0]:
bcx_px = float(kv[1]) # Nika reports the x coord relative to 'bottom left' corner of detector
# where beam axis intersects detector plane, in pixels
if 'beam_center_y_pix' in kv[0]:
bcy_px = float(kv[1]) # same as beam_center_x_pix but for y
if 'horizontal_tilt_deg' in kv[0]:
htilt_deg = float(kv[1]) # Nika reports the horizontal tilt in degrees...
if 'vertical_tilt_deg' in kv[0]:
vtilt_deg = float(kv[1]) # Nika reports the vertical tilt in degrees...
if 'wavelength_A' in kv[0]:
wl_A = float(kv[1]) # Nika reports wavelength is in Angstroms
# get wavelength in m
wl_m = wl_A*1E-10
pxsz_x_um = pxsz_x_mm * 1000
pxsz_y_um = pxsz_y_mm * 1000
# TODO: check whether these rotation angle mappings are correct.
tilt_deg = -1.*htilt_deg
rot_fit2d = vtilt_deg
# use a pyFAI.AzimuthalIntegrator() to do the conversion
p = pyFAI.AzimuthalIntegrator(wavelength = wl_m)
p.setFit2D(d_mm,bcx_px,bcy_px,tilt_deg,rot_fit2d,pxsz_x_um,pxsz_y_um)
poni_dict = p.getPyFAI()
self.outputs['poni_dict'] = poni_dict