Source code for diffpy.morph.morphs.morphrgrid

#!/usr/bin/env python
##############################################################################
#
# diffpy.morph      by DANSE Diffraction group
#                   Simon J. L. Billinge
#                   (c) 2010 Trustees of the Columbia University
#                   in the City of New York.  All rights reserved.
#
# File coded by:    Chris Farrow
#
# See AUTHORS.txt for a list of people who contributed.
# See LICENSE.txt for license information.
#
##############################################################################
"""Class MorphRGrid -- put morph and target on desired grid."""


import numpy

from diffpy.morph.morphs.morph import LABEL_GR, LABEL_RA, Morph


[docs] class MorphRGrid(Morph): """Resample to specified r-grid. This resamples both the morph and target arrays to be on the specified grid. Configuration Variables ----------------------- xmin The lower-bound on the x-range. xmax The upper-bound on the x-range (exclusive within tolerance of 1e-8). xstep The x-spacing. Notes ----- If any of these is not defined or outside the bounds of the input arrays, then it will be taken to be the most inclusive value from the input arrays. These modified values will be stored as the above attributes. """ # Define input output types summary = "Interplolate data onto specified grid" xinlabel = LABEL_RA yinlabel = LABEL_GR xoutlabel = LABEL_RA youtlabel = LABEL_GR parnames = ["xmin", "xmax", "xstep"] # Define xmin xmax holders for adaptive x-grid refinement # Without these, the program r-grid can only decrease in interval size xmin_origin = None xmax_origin = None xstep_origin = None
[docs] def morph(self, x_morph, y_morph, x_target, y_target): """Resample arrays onto specified grid.""" if self.xmin is not None: self.xmin_origin = self.xmin if self.xmax is not None: self.xmax_origin = self.xmax if self.xstep is not None: self.xstep_origin = self.xstep Morph.morph(self, x_morph, y_morph, x_target, y_target) xmininc = max(min(self.x_target_in), min(self.x_morph_in)) x_step_target = (max(self.x_target_in) - min(self.x_target_in)) / ( len(self.x_target_in) - 1 ) x_step_morph = (max(self.x_morph_in) - min(self.x_morph_in)) / ( len(self.x_morph_in) - 1 ) xstepinc = max(x_step_target, x_step_morph) xmaxinc = min( max(self.x_target_in) + x_step_target, max(self.x_morph_in) + x_step_morph, ) if self.xmin_origin is None or self.xmin_origin < xmininc: self.xmin = xmininc if self.xmax_origin is None or self.xmax_origin > xmaxinc: self.xmax = xmaxinc if self.xstep_origin is None or self.xstep_origin < xstepinc: self.xstep = xstepinc # roundoff tolerance for selecting bounds on arrays. epsilon = self.xstep / 2 # Make sure that xmax is exclusive self.x_morph_out = numpy.arange( self.xmin, self.xmax - epsilon, self.xstep ) self.y_morph_out = numpy.interp( self.x_morph_out, self.x_morph_in, self.y_morph_in ) self.x_target_out = self.x_morph_out.copy() self.y_target_out = numpy.interp( self.x_target_out, self.x_target_in, self.y_target_in ) return self.xyallout
# End of class MorphRGrid