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
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