Esempio n. 1
0
    def start_raster(self, *args, **kwargs):
        if self.props.state == self.StateType.ACTIVE:
            self.widget.raster_progress_lbl.set_text("Pausing raster ...")
            self.collector.pause()
        elif self.props.state == self.StateType.PAUSED:
            self.widget.raster_progress_lbl.set_text("Resuming raster ...")
            self.collector.resume()
        elif self.props.state == self.StateType.READY:
            self.widget.raster_progress_lbl.set_text("Starting raster ...")
            params = {
                'name': datetime.now().strftime('%y%m%d-%H%M'),
                'uuid': str(uuid.uuid4()),
                'activity': 'raster',
                'energy': self.beamline.energy.get_position(),
                'delta': RASTER_DELTA,
                'attenuation': self.beamline.attenuator.get(),
            }
            params.update(self.microscope.grid_params)
            params.update(self.form.get_values())
            params.update({
                'distance': resol_to_dist(params['resolution'], self.beamline.detector.mm_size, params['energy']),
                'origin': self.beamline.goniometer.stage.get_xyz(),
            })

            params = datatools.update_for_sample(params, self.sample_store.get_current())
            self.collector.configure(params)
            self.collector.start()
Esempio n. 2
0
    def take_snapshot(self):
        params = self.form.get_values()
        params['angle'] = self.beamline.goniometer.omega.get_position()
        params['energy'] = self.beamline.energy.get_position()
        params['distance'] = resol_to_dist(params['resolution'],
                                           self.beamline.detector.mm_size,
                                           params['energy'])
        params['attenuation'] = self.beamline.attenuator.get()
        params['delta'] = 1.0
        params['uuid'] = str(uuid.uuid4())
        params['name'] = datetime.now().strftime('%y%m%d-%H%M%S')
        params['activity'] = 'humidity'
        params = datatools.update_for_sample(params,
                                             self.sample_store.get_current())

        self.collector.configure(params)
        self.collector.start()
Esempio n. 3
0
    def configure(self, info):
        info['frames'] = datatools.count_frames(info)
        info['distance'] = converter.resol_to_dist(info['resolution'], self.beamline.detector.mm_size, info['energy'])

        min_res = converter.dist_to_resol(
            self.beamline.config['distance_limits'][0], self.beamline.detector.mm_size, info['energy']
        )
        max_res = converter.dist_to_resol(
            self.beamline.config['distance_limits'][1], self.beamline.detector.mm_size, info['energy']
        )
        self.form.fields['resolution'].set_converter(
            Validator.Float(min_res, max_res, default=2.0)
        )

        defaults = self.get_default(info['strategy'])
        defaults.update(info)
        self.form.set_values(info)

        # disable/enable inverse field
        inverse = self.form.get_field('inverse')
        strategy = self.form.get_value('strategy')
        inverse.set_sensitive((strategy == StrategyType.FULL and 'inverse' not in self.disabled))
Esempio n. 4
0
 def move_operation(self, target):
     dist_target = converter.resol_to_dist(target, self.detector_size,
                                           self.energy.get_position())
     self.distance.move_operation(dist_target)
Esempio n. 5
0
    def center_diffraction(self):
        self.center_loop(3, 1)
        scores = []
        if self.score < 0.5:
            logger.error('Loop-centering failed, aborting!')
            return

        scores.append(self.score)
        aperture = self.beamline.aperture.get()
        resolution = RASTER_RESOLUTION
        energy = self.beamline.energy.get_position()

        for step in ['edge', 'face']:
            logger.info('Performing raster scan on {}'.format(step))
            self.beamline.goniometer.wait(start=False)
            if step == 'face':
                self.beamline.goniometer.omega.move_by(-90, wait=True)

            time.sleep(2.0)
            params = {
                'name':
                datetime.now().strftime('%y%m%d-%H%M'),
                'uuid':
                str(uuid.uuid4()),
                'activity':
                'raster',
                'energy':
                energy,
                'delta':
                RASTER_DELTA,
                'exposure':
                RASTER_EXPOSURE,
                'attenuation':
                self.beamline.attenuator.get(),
                'aperture':
                aperture,
                'distance':
                converter.resol_to_dist(resolution,
                                        self.beamline.detector.mm_size,
                                        energy),
                'origin':
                self.beamline.goniometer.stage.get_xyz(),
                'resolution':
                resolution,
            }
            if step == 'edge':
                params.update({
                    'angle':
                    self.beamline.goniometer.omega.get_position(),
                    'width':
                    min(aperture * 5, 200.0),
                    'height':
                    min(aperture * 5, 200.0),
                    'frames':
                    5,
                    'lines':
                    5,
                })
            else:
                params.update({
                    'angle':
                    self.beamline.goniometer.omega.get_position(),
                    'width':
                    min(aperture * 4, 200.0),
                    'height':
                    min(aperture * 4, 200.0),
                    'frames':
                    4,
                    'lines':
                    4,
                })

            params = datatools.update_for_sample(
                params, self.sample_store.get_current())
            logger.info('Finding best diffraction spot in grid')
            self.collector.configure(params)
            self.collector.run()

            grid_scores = numpy.array([
                (index, misc.frame_score(report))
                for index, report in sorted(self.collector.results.items())
            ])

            best = grid_scores[:, 1].argmax()

            index = int(grid_scores[best, 0])
            score = grid_scores[best, 1]

            logger.info(f'Best diffraction at {index}: score={score}')
            grid = self.collector.get_grid()
            point = grid[best]

            self.beamline.goniometer.stage.move_xyz(point[0],
                                                    point[1],
                                                    point[2],
                                                    wait=True)
            scores.append(score / 100.)
        self.score = numpy.mean(scores)
Esempio n. 6
0
    def on_change(self, field, event, name):
        super().on_change(field, event, name)

        if name == 'delta':
            delta = self.get_value('delta')
            exposure = delta / self.exposure_rate
            self.set_value('exposure', exposure)
        elif name == 'exposure':
            exposure = self.get_value('exposure')
            delta = self.get_value('delta')
            self.exposure_rate = delta / exposure
        elif name == 'energy':
            # calculate resolution limits based on energy
            energy = self.get_value('energy')
            resolution = self.get_value('resolution')
            min_res = converter.dist_to_resol(
                self.beamline.config['distance_limits'][0], self.beamline.detector.mm_size, energy
            )
            max_res = converter.dist_to_resol(
                self.beamline.config['distance_limits'][1], self.beamline.detector.mm_size, energy
            )
            self.fields['resolution'].set_converter(
                Validator.Float(min_res, max_res, default=2.0)
            )
            resolution = converter.dist_to_resol(self.get_value('distance'), self.beamline.detector.mm_size, energy)
            self.set_value('resolution', resolution)

        if name == 'resolution':
            resolution = self.get_value('resolution')
            energy = self.get_value('energy')
            distance = converter.resol_to_dist(resolution, self.beamline.detector.mm_size, energy)
            self.set_value('distance', distance)

        if name == 'strategy':
            strategy = self.get_value('strategy')
            defaults = Strategy.get(strategy)
            default_rate = self.beamline.config['default_delta'] / float(self.beamline.config['default_exposure'])
            if 'delta' in defaults and 'exposure' not in defaults:
                defaults['exposure'] = defaults['delta'] / default_rate
            elif 'exposure' in defaults and 'delta' not in defaults:
                defaults['delta'] = default_rate / defaults['exposure']
                self.exposure_rate = default_rate

            inverse = self.get_field('inverse')
            inverse.set_sensitive((strategy == StrategyType.FULL and 'inverse' not in self.disabled))
            self.set_values(defaults)

        if name == 'inverse':
            inverse = self.get_value('inverse')
            if inverse:
                self.set_value('range', min(180., self.get_value('range')))

        if name in ['delta', 'strategy', 'range', 'inverse']:
            range = self.get_value('range')
            inverse = self.get_value('inverse')
            if inverse:
                range = min(180., range)
                self.set_value('range', range)
            strategy = self.get_value('strategy')
            delta = self.get_value('delta')
            first = self.get_value('first')
            skip = calculate_skip(strategy, range, delta, first)
            frames = datatools.calc_num_frames(strategy, delta, range, skip=skip)
            self.set_value('frames', frames)