示例#1
0
    def process_dataset(self, metadata, flags=(), sample=None):
        numbers = datatools.frameset_to_list(metadata['frames'])
        filename = os.path.join(metadata['directory'], metadata['filename'].format(numbers[0]))
        suffix = 'anom' if 'anomalous' in flags else 'native'
        params = {
            'uuid': str(uuid.uuid4()),
            'title': 'MX analysis in progress ...',
            'state': self.manager.State.ACTIVE,
            'data': metadata,

            'sample_id': metadata['sample_id'],
            'name': metadata['name'],
            'file_names': [filename],
            'anomalous': 'anomalous' in flags,
            'activity': 'proc-{}'.format(suffix),
            'type': metadata['type'],
        }
        params = datatools.update_for_sample(params, sample, overwrite=False)
        self.manager.add_item(params, False)
        try:
            report = yield self.beamline.dps.process_mx(params, params['directory'], misc.get_project_name())
        except Exception as e:
            logger.error('MX analysis failed: {}'.format(str(e)))
            self.failed(e, params['uuid'], self.ResultType.MX)
            returnValue({})
        else:
            report['data_id'] = [_f for _f in [metadata.get('id')] if _f]
            self.save_report(report)
            self.succeeded(report, params['uuid'], self.ResultType.MX)
            returnValue(report)
示例#2
0
 def create_message(self, item):
     if item.user == misc.get_project_name():
         config = ChatMessageLTR()
     else:
         config = ChatMessageRTL()
     config.set_item(item)
     return config.get_widget()
示例#3
0
 def set_config(self, status=None, avatar=None):
     user = misc.get_project_name()
     self.config = self.configs.copy()
     status = status if status is not None else 1
     avatar = avatar if avatar is not None else self.configs.get(user, {}).get('avatar', 0)
     self.configs[user] = {'status': status, 'avatar': avatar}
     self.set_state(config=self.configs.copy())
示例#4
0
 def url(self, path):
     url_path = path[1:] if path[0] == '/' else path
     return '{}/api/v2/{}/{}'.format(
         self.address,
         self.signer.sign(misc.get_project_name()),
         url_path
     )
示例#5
0
    def prepare_for_wedge(self, wedge):
        logger.debug('Preparing for new dataset wedge ...')
        # setup folder for wedge
        self.beamline.dss.setup_folder(wedge['directory'],
                                       misc.get_project_name())

        # delete existing frames
        frames = [i + wedge['first'] for i in range(wedge['num_frames'])]
        self.beamline.detector.delete(wedge['directory'], wedge['name'],
                                      frames)

        # make sure shutter is closed before starting
        self.beamline.fast_shutter.close()

        # setup devices
        if abs(self.beamline.energy.get_position() -
               wedge['energy']) >= 0.0005:
            self.beamline.energy.move_to(wedge['energy'], wait=True)

        if abs(self.beamline.distance.get_position() -
               wedge['distance']) >= 0.1:
            self.beamline.distance.move_to(wedge['distance'], wait=True)

        self.beamline.attenuator.set(wedge['attenuation'], wait=True)
        logger.debug('Ready for acquisition.')
示例#6
0
    def set_config(self, status=None, avatar=None):
        user = misc.get_project_name()
        conf_key = self.conf.format(user)
        stat_key = self.stat.format(user)

        status = status if status is not None else 1
        avatar = avatar if avatar is not None else self.configs.get(user, {}).get('avatar', 0)

        # send config
        self.server.set(conf_key, json.dumps({'status': status, 'avatar': avatar}))
        self.server.publish(stat_key, time.time())
示例#7
0
文件: humidity.py 项目: michel4j/mxdc
 def analyse_frame(self, file_path):
     self.pending_results.add(file_path)
     logger.info("Analyzing frame: {}".format(file_path))
     try:
         report = yield self.beamline.dps.analyse_frame(
             file_path, misc.get_project_name())
     except Exception as e:
         self.result_fail(e, file_path)
         returnValue({})
     else:
         self.result_ready(report, file_path)
         returnValue(report)
示例#8
0
 def analyse_frame(self, file_path, index):
     frame = os.path.splitext(os.path.basename(file_path))[0]
     logger.info("Analyzing frame: {}".format(frame))
     try:
         report = yield self.beamline.dps.analyse_frame(
             file_path, misc.get_project_name())
     except Exception as e:
         self.result_fail(e, index, file_path)
         returnValue({})
     else:
         self.result_ready(report, index, file_path)
         returnValue(report)
示例#9
0
    def update_configs(self, client, configs):
        self.configs = configs
        for msg in self.messages:
            msg.props.avatar = self.configs.get(msg.user, {}).get('avatar', 0)

        user = misc.get_project_name()
        current = self.configs.get(user, {}).get('avatar', 0)
        child = self.widget.avatar_box.get_child_at_index(current)
        self.widget.avatar_box.select_child(child)

        # update button icon
        specs = Gtk.IconSize.lookup(Gtk.IconSize.BUTTON)
        size = (specs.width, specs.height)
        self.widget.avatar_icon.set_from_pixbuf(gui.get_symbol(f'user-{current}.svg', 'avatars', size=size))
示例#10
0
 def configure(self, info):
     self.config = copy.deepcopy(info)
     self.config['edge_energy'], self.config['roi_energy'] = self.emissions[
         info['edge']]
     self.config['frame_template'] = '{}-{}_{}.xdi'.format(
         info['name'], info['edge'], '{:0>3d}')
     self.config['frame_glob'] = '{}-{}_{}.xdi'.format(
         info['name'], info['edge'], '*')
     self.config['targets'] = scitools.exafs_targets(
         self.config['edge_energy'], kmax=info['kmax'])
     self.config['user'] = misc.get_project_name()
     self.results = {}
     if not os.path.exists(self.config['directory']):
         os.makedirs(self.config['directory'])
示例#11
0
 def __init__(self, widget):
     self.widget = widget
     self.beamline = Registry.get_utility(IBeamline)
     self.messages = Gio.ListStore(item_type=Message)
     self.configs = {}
     self.add_avatars()
     self.widget.chat_messages.bind_model(self.messages, self.create_message)
     self.widget.chat_user_fbk.set_text(misc.get_project_name().upper())
     self.widget.avatar_box.connect('child-activated', self.select_avatar)
     self.widget.chat_config_btn.set_popover(self.widget.chat_avatars_pop)
     self.widget.chat_msg_entry.connect('activate', self.send_message)
     self.widget.chat_messages.connect('size-allocate', self.adjust_view)
     self.beamline.messenger.connect('message', self.show_message)
     self.beamline.messenger.connect('config', self.update_configs)
     self.configs = {}
示例#12
0
    def __init__(self, host, realm=None):
        super().__init__()
        self.realm = realm or 'SIM-1'
        self.channel = 'CHAT:{}:MSGS:{{}}'.format(self.realm)
        self.conf = 'CHAT:CONFIG:{}'
        self.stat = 'CHAT:STATUS:{}'
        self.key = self.channel.format(misc.get_project_name())
        self.server = redis.Redis(host=host, port=6379, db=0)
        self.watcher = self.server.pubsub()
        self.watcher.psubscribe(**{
            self.channel.format('*'): self.get_message,
            self.stat.format('*'): self.get_configs,

        })
        self.watch_thread = self.watcher.run_in_thread(sleep_time=0.01)
        self.get_configs()
示例#13
0
    def process_raster(self, params, flags=(), sample=None):
        params.update({
            'uuid': str(uuid.uuid4()),
            'activity': 'proc-raster',
        })
        params = datatools.update_for_sample(params, sample, overwrite=False)

        try:
            report = yield self.beamline.dps.analyse_frame(params['filename'], misc.get_project_name(), rastering=True)
        except Exception as e:
            logger.error('Raster analysis failed: {}'.format(str(e)))
            self.failed(e, params['uuid'], self.ResultType.RASTER)
            returnValue({})
        else:
            report['data_id'] = [_f for _f in [params.get('id')] if _f]
            self.succeeded(report, params['uuid'], self.ResultType.RASTER)
            returnValue(report)
示例#14
0
文件: humidity.py 项目: michel4j/mxdc
    def prepare(self, params):
        # setup folder for
        self.beamline.dss.setup_folder(params['directory'],
                                       misc.get_project_name())
        logger.debug('Setting up folder: {}'.format(params['directory']))
        # make sure shutter is closed before starting
        self.beamline.fast_shutter.close()

        if abs(self.beamline.distance.get_position() -
               params['distance']) >= 0.1:
            self.beamline.distance.move_to(params['distance'], wait=True)

        # switch to collect mode
        img = self.beamline.sample_camera.get_frame()
        img.save(
            os.path.join(self.config['params']['directory'],
                         '{}.png'.format(self.config['params']['name'])))
        self.beamline.manager.collect(wait=True)
示例#15
0
    def broadcast_service(self):
        self.remote_mxdc = None
        self.service_type = '_mxdc._tcp.local.'
        self.service_data = {
            'user': misc.get_project_name(),
            'started': time.asctime(time.localtime()),
            'beamline': self.beamline.name
        }

        unique = 'SIM' not in self.beamline.name  # allow multiple SIM instances
        self.provider = mdns.Provider(self.beamline.name,
                                      self.service_type,
                                      MXDC_PORT,
                                      self.service_data,
                                      unique=unique)
        self.provider.connect('collision', self.server_collision)
        self.provider.connect('running', self.start_server)
        GLib.idle_add(self.provider.start)
示例#16
0
    def take_snapshots(self):
        if self.config['take_snapshots'] and self.config['datasets']:
            names = [
                dataset.details['name']
                for dataset in self.config['datasets'].values()
            ]
            prefix = os.path.commonprefix(names) or 'SNAPSHOT'
            dataset = list(self.config['datasets'].values())[0]

            # setup folder
            self.beamline.dss.setup_folder(dataset.details['directory'],
                                           misc.get_project_name())

            # take snapshot
            snapshot_file = os.path.join(dataset.details['directory'],
                                         f'{prefix}.png')
            if not os.path.exists(snapshot_file):
                logger.info('Taking snapshot ...')
                img = self.beamline.sample_camera.get_frame()
                img.save(snapshot_file)
示例#17
0
    def prepare(self, params):
        self.beamline.detector_cover.open(wait=True)
        self.total_frames = self.config['params']['frames'] * self.config[
            'params']['lines']
        self.pending_results = set()
        self.results = {}

        # setup folder for
        self.beamline.dss.setup_folder(params['directory'],
                                       misc.get_project_name())

        # make sure shutter is closed before starting
        self.beamline.fast_shutter.close()

        if abs(self.beamline.distance.get_position() -
               params['distance']) >= 0.1:
            self.beamline.distance.move_to(params['distance'], wait=True)

        # switch to collect mode
        self.beamline.manager.collect(wait=True)
示例#18
0
    def process_multiple(self, *metadatas, **kwargs):
        sample = kwargs.get('sample', None)
        flags = kwargs.get('flags', ())
        file_names = []
        names = []
        for metadata in metadatas:
            numbers = datatools.frameset_to_list(metadata['frames'])
            file_names.append(os.path.join(metadata['directory'], metadata['filename'].format(numbers[0])))
            names.append(metadata['name'])

        metadata = metadatas[0]
        suffix = 'mad' if 'mad' in flags else 'merge'
        params = {
            'uuid': str(uuid.uuid4()),
            'title': 'MX {} analysis in progress ...'.format(suffix.upper()),
            'state': self.manager.State.ACTIVE,
            'data': metadata,

            'sample_id': metadata['sample_id'],
            'name': '-'.join(names),
            'file_names': file_names,
            'anomalous': 'anomalous' in flags,
            'merge': 'merge' in flags,
            'mad': 'mad' in flags,
            'activity': 'proc-{}'.format(suffix),
            'type': metadata['type'],
        }
        params = datatools.update_for_sample(params, sample, overwrite=False)
        self.manager.add_item(params, False)

        try:
            report = yield self.beamline.dps.process_mx(params, params['directory'], misc.get_project_name())
        except Exception as e:
            logger.error('MX analysis failed: {}'.format(str(e)))
            self.failed(e, params['uuid'], self.ResultType.MX)
            returnValue({})
        else:
            report['data_id'] = [_f for _f in [metadata.get('id') for metadata in metadatas] if _f]
            self.save_report(report)
            self.succeeded(report, params['uuid'], self.ResultType.MX)
            returnValue(report)
示例#19
0
    def configure(self, **kwargs):
        super().configure(**kwargs)
        self.config.update(
            filename=os.path.join(self.config.directory,
                                  "{}.xdi".format(self.config.name)),
            user=misc.get_project_name(),
        )

        self.data_units['energy'] = 'keV'
        names = ['energy', 'normfluor'] + [
            'ifluor{}'.format(i + 1) for i in range(self.beamline.mca.elements)
        ]
        self.data_type = {
            'names': names,
            'formats': ['f4'] * len(names),
        }
        self.data_scale = [(names[1], )]
        self.results = {}

        # create directory
        if not os.path.exists(self.config['directory']):
            os.makedirs(self.config['directory'])
示例#20
0
    def configure(self, **kwargs):
        super().configure(**kwargs)
        edge_energy, roi_energy = self.emissions[self.config.edge]
        self.config.update(edge_energy=edge_energy,
                           roi_energy=roi_energy,
                           positions=scitools.xanes_targets(edge_energy),
                           user=misc.get_project_name(),
                           filename=os.path.join(
                               self.config.directory,
                               "{}.xdi".format(self.config.name)))
        names = ['energy', 'normfluor'] + [
            'ifluor{}'.format(i + 1) for i in range(self.beamline.mca.elements)
        ] + ['i0']
        self.data_units['energy'] = 'keV'
        self.data_type = {
            'names': names,
            'formats': ['f4'] * len(names),
        }

        self.data_scale = [tuple(names[1:-1]), (names[-1], )]

        if not os.path.exists(self.config['directory']):
            os.makedirs(self.config['directory'])
示例#21
0
 def __init__(self):
     super().__init__()
     self.configs = {
         'xtalbot': {'status': 1, 'avatar': random.randint(0, 50)},
         misc.get_project_name(): {'status': 1, 'avatar': random.randint(0, 50)},
     }
示例#22
0
 def send(self, message):
     self.set_state(message=(misc.get_project_name(), message))
     GLib.timeout_add(random.randint(2000, 10000), self.bot_reply)
示例#23
0
    def process_powder(self, metadata, flags=(), sample=None):
        file_names = [
            os.path.join(metadata['directory'], metadata['filename'].format(number))
            for number in datatools.frameset_to_list(metadata['frames'])
        ]

        params = {
            'uuid': str(uuid.uuid4()),
            'title': 'XRD Analysis in progress ...',
            'state': self.manager.State.ACTIVE,
            'data': metadata,

            'sample_id': metadata['sample_id'],
            'name': metadata['name'],
            'file_names': file_names,
            'calib': 'calibrate' in flags,
            'activity': 'proc-xrd',
            'type': metadata['type'],
        }
        params = datatools.update_for_sample(params, sample, overwrite=False)
        self.manager.add_item(params, False)
        try:
            report = yield self.beamline.dps.process_xrd(params, params['directory'], misc.get_project_name())
        except Exception as e:
            logger.error('XRD analysis failed: {}'.format(str(e)))
            self.failed(e, params['uuid'], self.ResultType.XRD)
            returnValue({})
        else:
            report['data_id'] = [_f for _f in [metadata.get('id')] if _f]
            self.save_report(report)
            self.succeeded(report, params['uuid'], self.ResultType.XRD)
            returnValue(report)