def filter_frames(self, data):
        print '############ ONE FILTER FRAME ########################'
        bc = [0, 0]
        distance, bc[0], bc[1], yaw, roll, px, px = self.ai_params
        t1 = time.time()
        data = data[0].astype(np.float)
        data -= np.min(data)
        mData = self.params[1]
        #         print self.params[2]
        #         foo = self.params[2]

        ai = AzimuthalIntegrator()
        ai.setFit2D(distance, bc[0], bc[1], yaw, roll, px, px, None)
        ai.set_wavelength(self.wl)
        foo = units.to_unit(units.TTH)
        twotheta = ai.__getattribute__(foo.center)(
            self.sh)  # get the detector array of Q # preallocate
        twotheta *= 180.0 / np.pi  # preallocate
        twotheta_flat = twotheta.ravel()  #pre allocate
        logging.debug(ai)
        #         twotheta_flat = self.params[3]
        logging.debug("Running azimuthal integration")
        mask = np.zeros_like(data, np.int)
        fit = ai.integrate1d(data=data,
                             npt=self.npts,
                             unit='q_A^-1',
                             correctSolidAngle=False)
        print "here"
        mData.set_meta_data('Q', fit[0])
        newplot = self.calcfrom1d(fit[0], fit[1], twotheta_flat)
        rat = data / newplot
        thing = data.copy()
        thing[np.abs(rat - 1.0) > self.parameters['thresh'] * 1e-2] = 0.0

        mask[thing == 0] = 1
        #         mask[data < minval] = 0
        #mask[data > maxval] = 0
        #         final = ai.integrate1d(data=data, npt=self.npts,unit='q_A^-1', correctSolidAngle=False)# works...
        del ai

        ai = AzimuthalIntegrator()
        ai.setFit2D(distance, bc[0], bc[1], yaw, roll, px, px, None)
        ai.set_wavelength(self.wl)
        print "DATA.shape is %s " % str(data.shape)

        final = ai.integrate1d(data,
                               self.npts,
                               mask=mask,
                               unit='q_A^-1',
                               correctSolidAngle=False,
                               method='numpy')  # doesn't work
        #         final = ai.integrate1d(data=data, npt=self.npts,mask=mask,unit='q_A^-1', correctSolidAngle=False)# doesn't work
        t2 = time.time()
        del ai
        #         print final[1].shape
        print "PyFAI iteration with correction took:" + str(
            (t2 - t1) * 1e3) + "ms"
        print '##################END##################'
        return final[1]
Пример #2
0
def test_AzimuthalIntegrator_pickle():
    import dill
    import numpy as np
    from pyFAI import AzimuthalIntegrator

    det = pyFAI.detectors.detector_factory('pilatus2m')
    ai = AzimuthalIntegrator(detector=det)
    ai.set_wavelength(.1)
    spectra = ai.integrate1d(np.ones(det.shape), 1000)  # force lut generation
    dump = dumps(ai)
    newai = loads(*dump)
    assert np.array_equal(newai.integrate1d(np.ones(det.shape), 1000), spectra)
    assert newai.detector.shape == (1679, 1475)
Пример #3
0
def test_FourierCalibrationWorkflow():
    workflow = FourierCalibrationWorkflow()

    data = fabio.open('/home/rp/data/YL1031/AGB_5S_USE_2_2m.edf').data
    ai = AzimuthalIntegrator()
    ai.set_wavelength(124e-12)
    ai.detector = detectors.Pilatus2M()
    c = calibrant.ALL_CALIBRANTS('AgBh')

    print(
        workflow.execute(None,
                         data=data,
                         ai=ai,
                         calibrant=c,
                         callback_slot=print))
    def pre_process(self):
        in_dataset, out_datasets = self.get_datasets()
        mData = self.get_in_meta_data()[0]
        in_d1 = in_dataset[0]
        ai = AzimuthalIntegrator()  # get me an integrator object
        # prep the goemtry
        px_m = mData.get_meta_data('x_pixel_size')
        bc_m = [
            mData.get_meta_data("beam_center_x"),
            mData.get_meta_data("beam_center_y")
        ]  # in metres
        bc = bc_m / px_m  # convert to pixels
        px = px_m * 1e6  # convert to microns
        distance = mData.get_meta_data('distance') * 1e3  # convert to mm
        wl = mData.get_meta_data('incident_wavelength')[...]  # in m
        self.wl = wl

        yaw = -mData.get_meta_data("yaw")
        roll = mData.get_meta_data("roll")
        self.ai_params = distance, bc[0], bc[1], yaw, roll, px, px
        ai.setFit2D(distance, bc[0], bc[1], yaw, roll, px, px, None)
        ai.set_wavelength(wl)
        logging.debug(ai)

        self.sh = in_d1.get_shape()[-2:]
        self.npts = self.get_parameters('num_bins')
        foo = units.to_unit(units.TTH)  #  preallocate
        pretenddata = np.zeros(self.sh)
        pretendfit = ai.integrate1d(data=pretenddata,
                                    npt=self.npts,
                                    unit='q_A^-1',
                                    correctSolidAngle=False)
        self.add_axes_to_meta_data(pretendfit[0], mData)
        twotheta = ai.__getattribute__(foo.center)(
            self.sh)  # get the detector array of Q # preallocate
        twotheta *= 180.0 / np.pi  # preallocate
        twotheta_flat = twotheta.ravel()  #pre allocate
        self.params = [self.npts, mData, twotheta_flat]
    def pre_process(self):
        """
        This method is called after the plugin has been created by the
        pipeline framework as a pre-processing step

        :param parameters: A dictionary of the parameters for this plugin, or
            None if no customisation is required
        :type parameters: dict
        """
        in_dataset, out_datasets = self.get_datasets()
        mData = self.get_in_meta_data()[0]
        in_d1 = in_dataset[0]
        ai = AzimuthalIntegrator()  # get me an integrator object
        ### prep the goemtry
        bc = [mData.get_meta_data("beam_center_x")[...],
              mData.get_meta_data("beam_center_y")[...]]
        distance = mData.get_meta_data('distance')[...]
        wl = mData.get_meta_data('incident_wavelength')[...]
        px = mData.get_meta_data('x_pixel_size')[...]
        orien = mData.get_meta_data(
            '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]))
        ai.setFit2D(distance, bc[0], bc[1], -yaw, roll, px, px, None)
        ai.set_wavelength(wl)
        
        self.sh = in_d1.get_shape()[-2:]
        self.npts = self.get_parameters('num_bins')
        foo = units.to_unit(units.TTH) #  preallocate
        pretenddata = np.zeros(self.sh)
        pretendfit = ai.xrpd(data=pretenddata, npt=self.npts)
        twotheta=ai.__getattribute__(foo.center)(ai.detector.max_shape) # get the detector array of Q # preallocate
        twotheta *= 180.0/np.pi # preallocate
        twotheta_flat = twotheta.ravel() #pre allocate
        self.params = [self.npts, mData, ai, twotheta_flat]