def test_simple_replace(): new_cmd = "replaced" def change_command(msg): return msg._replace(command=new_cmd) num = 10 msgs = EchoRE(msg_mutator(echo_plan(num=num), change_command)) _verify_msg_seq(msgs, m_len=num, cmd_sq=[new_cmd] * num, args_sq=[()] * num, kwargs_sq=[{}] * num)
def test_simple_replace(): new_cmd = 'replaced' def change_command(msg): return msg._replace(command=new_cmd) num = 10 msgs = EchoRE(msg_mutator(echo_plan(num=num), change_command)) _verify_msg_seq(msgs, m_len=num, cmd_sq=[new_cmd] * num, args_sq=[()] * num, kwargs_sq=[{}] * num)
def test_msg_mutator_skip(): def skipper(msg): if msg.command == 'SKIP': return None return msg def skip_plan(): for c in 'abcd': yield Msg(c, None) yield Msg('SKIP', None) pln = msg_mutator(skip_plan(), skipper) msgs = EchoRE(pln) _verify_msg_seq(msgs, m_len=4, cmd_sq='abcd', args_sq=[()] * 4, kwargs_sq=[{}] * 4)
def __call__(self, sample, plan, subs=None, *, verify_write=False, dark_strategy=periodic_dark, raise_if_interrupted=False, **metadata_kw): # The CustomizedRunEngine knows about a Beamtime object, and it # interprets integers for 'sample' as indexes into the Beamtime's # lists of Samples from all its Experiments. # deprecated from v0.5 release #if getattr(glbl, 'collection', None) is None: # raise RuntimeError("No collection has been linked to current " # "experiment yet.\nPlease do\n" # ">>> open_collection(<collection_name>)\n" # "before you run any prun") if isinstance(sample, int): try: sample = self.beamtime.samples[sample] except IndexError: print("WARNING: hmm, there is no sample with index `{}`" ", please do `bt.list()` to check if it exists yet" .format(sample)) return # If a plan is given as a string, look in up in the global registry. if isinstance(plan, int): try: plan = self.beamtime.scanplans[plan] except IndexError: print("WARNING: hmm, there is no scanplan with index `{}`" ", please do `bt.list()` to check if it exists yet" .format(plan)) return # If the plan is an xpdAcq 'ScanPlan', make the actual plan. if isinstance(plan, ScanPlan): plan = plan.factory() _subs = normalize_subs_input(subs) if verify_write: _subs.update({'stop': verify_files_saved}) # No keys in metadata_kw are allows to collide with sample keys. if set(sample) & set(metadata_kw): raise ValueError("These keys in metadata_kw are illegal " "because they are always in sample: " "{}".format(set(sample) & set(metadata_kw))) if self._beamtime.get('bt_wavelength') is None: print("WARNING: there is no wavelength information in current" "beamtime object, scan will keep going....") metadata_kw.update(sample) sh = glbl.shutter # force to open shutter before scan and close it after if glbl.shutter_control: plan = bp.pchain(bp.abs_set(sh, 1), plan, bp.abs_set(sh, 0)) # Alter the plan to incorporate dark frames. if glbl.auto_dark: plan = dark_strategy(plan) plan = bp.msg_mutator(plan, _inject_qualified_dark_frame_uid) # Load calibration file if glbl.auto_load_calib: plan = bp.msg_mutator(plan, _inject_calibration_md) # Execute super().__call__(plan, subs, raise_if_interrupted=raise_if_interrupted, **metadata_kw) # deprecated from v0.5 release # insert collection #_insert_collection(glbl.collection_name, glbl.collection, # self._run_start_uids) return self._run_start_uids
def __call__(self, sample, plan, subs=None, *, verify_write=False, dark_strategy=periodic_dark, raise_if_interrupted=False, **metadata_kw): # The CustomizedRunEngine knows about a Beamtime object, and it # interprets integers for 'sample' as indexes into the Beamtime's # lists of Samples from all its Experiments. # deprecated from v0.5 release #if getattr(glbl, 'collection', None) is None: # raise RuntimeError("No collection has been linked to current " # "experiment yet.\nPlease do\n" # ">>> open_collection(<collection_name>)\n" # "before you run any xrun") if isinstance(sample, int): try: sample = self.beamtime.samples[sample] except IndexError: print( "WARNING: hmm, there is no sample with index `{}`" ", please do `bt.list()` to check if it exists yet".format( sample)) return # If a plan is given as a string, look in up in the global registry. if isinstance(plan, int): try: plan = self.beamtime.scanplans[plan] except IndexError: print( "WARNING: hmm, there is no scanplan with index `{}`" ", please do `bt.list()` to check if it exists yet".format( plan)) return # If the plan is an xpdAcq 'ScanPlan', make the actual plan. if isinstance(plan, ScanPlan): plan = plan.factory() _subs = normalize_subs_input(subs) if verify_write: _subs.update({'stop': verify_files_saved}) # No keys in metadata_kw are allows to collide with sample keys. if set(sample) & set(metadata_kw): raise ValueError("These keys in metadata_kw are illegal " "because they are always in sample: " "{}".format(set(sample) & set(metadata_kw))) if self._beamtime.get('bt_wavelength') is None: print("WARNING: there is no wavelength information in current" "beamtime object, scan will keep going....") metadata_kw.update(sample) sh = glbl.shutter if glbl.shutter_control: # Alter the plan to incorporate dark frames. # only works if user allows shutter control if glbl.auto_dark: plan = dark_strategy(plan) plan = bp.msg_mutator(plan, _inject_qualified_dark_frame_uid) # force to close shutter after scan plan = bp.finalize_wrapper(plan, bp.abs_set(sh, 0, wait=True)) # Load calibration file if glbl.auto_load_calib: plan = bp.msg_mutator(plan, _inject_calibration_md) # Insert glbl mask plan = bp.msg_mutator(plan, _inject_mask) # Execute return super().__call__(plan, subs, raise_if_interrupted=raise_if_interrupted, **metadata_kw)