Ejemplo n.º 1
0
 def load_cbf(self, prefix: str, fsn: int):
     """Load the CBF file."""
     cbfbasename = self.exposurefileformat(prefix, fsn) + '.cbf'
     for subpath in [prefix, '']:
         cbfname = os.path.join(
             self.instrument.config['path']['directories']['images'],
             subpath, cbfbasename)
         try:
             return readcbf(cbfname)[0]
         except FileNotFoundError:
             pass
     raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), cbfbasename)
Ejemplo n.º 2
0
    def worker(self):
        try:
            while True:
                assert isinstance(self.inqueue, multiprocessing.queues.Queue)
                if (time.monotonic() - self._lasttelemetry) > self.telemetry_interval:
                    # forge a telemetry request message.
                    message = Message('telemetry', 0, self.name)
                else:
                    try:
                        message = self.inqueue.get(True, self.telemetry_interval)
                    except queue.Empty:
                        continue
                assert isinstance(message, Message)
                if message['type'] == 'exit':
                    break  # the while True loop
                elif message['type'] == 'config':
                    self.config = message['configdict']
                elif message['type'] == 'telemetry':
                    self.send_to_frontend('telemetry', telemetry=self.get_telemetry())
                elif message['type'] == 'analyze':
                    self._logger.debug(
                        'Got work: prefix = {}, fsn = {}, filename = {}'.format(message['prefix'], message['fsn'],
                                                                                message['filename']))
                    cbfdata = None
                    for fn in [message['filename'], os.path.split(message['filename'])[-1]]:
                        self._logger.debug('Trying filename form: {}'.format(fn))
                        for subpath in [message['prefix'], '']:
                            try:
                                self._logger.debug('Trying subpath {}'.format(subpath))
                                cbfdata = readcbf(os.path.join(self.config['path']['directories']['images'],
                                                               subpath, fn))[0]
                                self._logger.debug('File found in subpath {}'.format(subpath))
                                break
                            except FileNotFoundError as fe:
                                cbfdata = (fe, traceback.format_exc())
                            except Exception as ex:
                                self.send_to_frontend('error', exception=ex, traceback=traceback.format_exc(),
                                                      fsn=message['fsn'], prefix=message['prefix'])
                                raise
                        if isinstance(cbfdata, np.ndarray):
                            # the file has been found, do not try to load it in a different form.
                            break
                    if isinstance(cbfdata, tuple) and (isinstance(cbfdata[0], FileNotFoundError)):
                        # could not load cbf file, send a message to the frontend.
                        self._logger.error('Cannot load file: {}'.format(message['filename']))
                        self.send_to_frontend('error', exception=cbfdata[0],
                                              traceback=cbfdata[1], fsn=message['fsn'],
                                              prefix=message['prefix'])
                        self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])
                        continue
                    self._logger.debug('File {} loaded successfully.'.format(message['filename']))
                    assert isinstance(cbfdata, np.ndarray)
                    self._logger.debug('Survived assertion')
                    if message['prefix'] == self.config['path']['prefixes']['crd']:
                        self._logger.debug('Data reduction needed.')
                        # data reduction needed
                        try:
                            maskfilename = message['param']['geometry']['mask']
                            logger.debug('Mask found from parameter dictionary: ' + maskfilename)
                        except (KeyError, TypeError):
                            maskfilename = self.config['geometry']['mask']
                            logger.debug('Using default mask from config dictionary: ' + maskfilename)
                        try:
                            mask = self.get_mask(maskfilename)
                            assert isinstance(mask, np.ndarray)
                            im = self.datareduction(cbfdata, mask, message['param'])
                            self.savecorrected(message['prefix'], message['fsn'], im)
                            self.send_to_frontend('datareduction-done', prefix=message['prefix'], fsn=message['fsn'],
                                                  image=im)
                            self.send_to_frontend('image', prefix=message['prefix'], fsn=message['fsn'],
                                                  data=cbfdata, mask=mask, param=message['param'])
                        except Exception as exc:
                            self.send_to_frontend('error', prefix=message['prefix'], fsn=message['fsn'],
                                                  exception=exc, traceback=traceback.format_exc())
                            self._logger.error(
                                'Error in data reduction: {}, {}'.format(str(exc), traceback.format_exc()))
                        self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])
                    elif message['prefix'] == self.config['path']['prefixes']['tra']:  # transmission measurement
                        self._logger.debug('This is a transmission measurement.')
                        try:
                            transmmask = self.get_mask(self.config['transmission']['mask'])
                            assert isinstance(transmmask, np.ndarray)
                        except (IOError, OSError, IndexError) as exc:
                            # could not load a mask file
                            self.send_to_frontend('error', prefix=message['prefix'], fsn=message['fsn'],
                                                  exception=exc, traceback=traceback.format_exc())
                            self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])
                        else:
                            self.send_to_frontend('transmdata', prefix=message['prefix'], fsn=message['fsn'],
                                                  data=(cbfdata * transmmask).sum(), what=message['what'],
                                                  sample=message['sample'], )
                            self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])
                    elif message['prefix'] == self.config['path']['prefixes']['scn']:
                        self._logger.debug('This is a scan point.')
                        try:
                            scanmask = self.get_mask(self.config['scan']['mask'])
                            scanmasktotal = self.get_mask(self.config['scan']['mask_total'])
                        except (IOError, OSError, IndexError) as exc:
                            # could not load a mask file
                            self.send_to_frontend('error', prefix=message['prefix'], fsn=message['fsn'], exception=exc,
                                                  traceback=traceback.format_exc())
                            self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])
                            continue
                        assert isinstance(scanmask, np.ndarray)
                        assert isinstance(scanmasktotal, np.ndarray)
                        self._logger.debug('We have the scan masks')
                        # scan point, we have to calculate something.
                        stat = get_statistics(cbfdata, scanmasktotal, scanmask)
                        self._logger.debug('We have the statistics')
                        stat['FSN'] = message['fsn']
                        resultlist = tuple([message['position']] + [stat[k]
                                                                    for k in self.config['scan']['columns']])
                        self._logger.debug('Sending the image')
                        self.send_to_frontend('image', prefix=message['prefix'], fsn=message['fsn'],
                                              param=message['param'], mask=scanmasktotal, data=cbfdata)
                        self._logger.debug('Sending the scanpoint')
                        self.send_to_frontend('scanpoint', prefix=message['prefix'], fsn=message['fsn'],
                                              counters=resultlist, position=message['position'])
                        self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])

                    else:
                        self._logger.debug('Unknown prefix, just sending back image.')
                        try:
                            mask = self.get_mask(self.config['geometry']['mask'])
                        except (IOError, OSError, IndexError) as exc:
                            # could not load a mask file
                            self.send_to_frontend('error', prefix=message['prefix'], fsn=message['fsn'], exception=exc,
                                                  traceback=traceback.format_exc())
                        else:
                            self.send_to_frontend('image', prefix=message['prefix'], fsn=message['fsn'], data=cbfdata,
                                                  mask=mask, param=message['param'])
                        self.send_to_frontend('done', prefix=message['prefix'], fsn=message['fsn'])
        except Exception as exc:
            self.send_to_frontend('error', prefix='', fsn=0, exception=exc, traceback=traceback.format_exc())
        self.send_to_frontend('exited', prefix=None, fsn=None)