Ejemplo n.º 1
0
    def on_image(self, exposureanalyzer, prefix, fsn, matrix, params, mask):

        im = Exposure(matrix, header=Header(params), mask=mask)
        try:
            sample = im.header.title
        except KeyError:
            sample = "unknown sample"
        legend = "FSN #{:d}, {} at {:.2f} mm".format(im.header.fsn, sample, float(im.header.distance))
        if self.builder.get_object("plotimage_check").get_active():
            if self.builder.get_object("reuseimage_check").get_active():
                imgwin = PlotImageWindow.get_latest_window()
            else:
                imgwin = PlotImageWindow()
            imgwin.set_image(im.intensity)
            imgwin.set_mask(im.mask)
            imgwin.set_distance(im.header.distance)
            imgwin.set_beampos(im.header.beamcenterx, im.header.beamcentery)
            assert im.header.pixelsizex == im.header.pixelsizey
            imgwin.set_pixelsize(im.header.pixelsizex)
            imgwin.set_wavelength(im.header.wavelength)
            imgwin.set_title(legend)
        if self.builder.get_object("plotradial_check").get_active():
            if self.builder.get_object("reuseradial_check").get_active():
                curvewin = PlotCurveWindow.get_latest_window()
            else:
                curvewin = PlotCurveWindow()
            curve = im.radial_average()
            assert im.header.pixelsizex == im.header.pixelsizey
            curvewin.addcurve(
                curve.q,
                curve.Intensity,
                curve.qError,
                curve.Error,
                legend,
                "q",
                im.header.pixelsizex,
                im.header.distance,
                im.header.wavelength,
            )
        self._images_done += 1
        if self._images_done >= self._nimages:
            self.instrument.services["exposureanalyzer"].disconnect(self._expanalyzerconnection)
            self._expanalyzerconnection = None
Ejemplo n.º 2
0
 def absolutescaling(self, im: Exposure, datared: Dict):
     if im.header.title == self.config['datareduction']['absintrefname']:
         self._logger.debug('History: {}'.format('\n'.join([h for h in datared['history']])))
         dataset = np.loadtxt(self.config['datareduction']['absintrefdata'])
         self._logger.debug('Q-range of absint dataset: {:g} to {:g}, {:d} points.'.format(
             dataset[:, 0].min(), dataset[:, 0].max(), len(dataset[:, 0])))
         testradavg = im.radial_average()
         self._logger.debug('Auto-Q-range of the measured dataset: {:g} to {:g}, {:d} points.'.format(
             testradavg.q.min(), testradavg.q.max(), len(testradavg)))
         # noinspection PyPep8Naming,PyPep8Naming
         q, dq, I, dI, area = im.radial_average(qrange=dataset[:, 0], raw_result=True)
         dataset = dataset[area > 0, :]
         # noinspection PyPep8Naming
         I = I[area > 0]
         # noinspection PyPep8Naming
         dI = dI[area > 0]
         q = q[area > 0]
         self._logger.debug('Common q-range: {:g} to {:g}, {:d} points.'.format(q.min(), q.max(), len(q)))
         scalingfactor, stat = nonlinear_odr(I, dataset[:, 1], dI, dataset[:, 2], lambda x, a: a * x, [1])
         datared['absintscaling'] = {'q': q, 'area': area, 'Imeas': I, 'dImeas': dI,
                                     'Iref': dataset[:, 1], 'dIref': dataset[:, 2],
                                     'factor.val': scalingfactor.val,
                                     'factor.err': scalingfactor.err, 'stat': stat}
         self._logger.debug('Scaling factor: ' + str(scalingfactor))
         self._logger.debug('Chi2: {:f}'.format(stat['Chi2_reduced']))
         self._lastabsintref = im
         self._absintscalingfactor = scalingfactor
         self._absintstat = stat
         self._absintqrange = q
         datared['history'].append(
             'This is an absolute intensity reference measurement. '
             'Determined absolute intensity scaling factor: {}. Reduced Chi2: {:f}. DoF: {:d}. '
             'This corresponds to beam flux {} photons*eta/sec'.format(
                 self._absintscalingfactor, self._absintstat['Chi2_reduced'], self._absintstat['DoF'],
                 1 / self._absintscalingfactor))
     if ((im.header.distance - self._lastabsintref.header.distance).abs() <
             self.config['datareduction']['distancetolerance']):
         im *= self._absintscalingfactor
         datared['statistics']['08_absolutescaling'] = im.get_statistics()
         datared['history'].append(
             'Using absolute intensity factor {} from measurement FSN #{:d} '
             'for absolute intensity calibration.'.format(
                 self._absintscalingfactor, self._lastabsintref.header.fsn))
         datared['history'].append('Absint factor was determined with Chi2 {:f} (DoF {:d})'.format(
             self._absintstat['Chi2_reduced'], self._absintstat['DoF']))
         datared['history'].append('Estimated flux: {} photons*eta/sec'.format(
             self._absintscalingfactor.__reciprocal__()))
         datared['absintrefFSN'] = self._lastabsintref.header.fsn
         datared['flux'] = self._absintscalingfactor.__reciprocal__().val
         datared['flux.err'] = self._absintscalingfactor.__reciprocal__().err
         datared['absintchi2'] = self._absintstat['Chi2_reduced']
         datared['absintdof'] = self._absintstat['DoF']
         datared['absintfactor'] = self._absintscalingfactor.val
         datared['absintfactor.err'] = self._absintscalingfactor.err
         datared['absintqmin'] = self._absintqrange.min()
         datared['absintqmax'] = self._absintqrange.max()
     else:
         raise ServiceError(
             'S-D distance of the last seen absolute intensity reference measurement '
             'does not match the exposure under reduction.')
     self._logger.debug('Done absint FSN ' + str(im.header.fsn))
     return im, datared