Exemple #1
0
class User:
    SCALE = 1000.0
    """Generic User Object"""
    sequencer = sequencer

    def __init__(self):
        self.mesh_raw = EpicsSignal(name='mesh_raw',
                                    read_pv='MFX:USR:ai1:0',
                                    write_pv='MFX:USR:ao1:0')

    @property
    def current_rate(self):
        """Current configured EventSequencer rate"""
        return sequencer.sync_marker.get(as_string=True)

    def configure_sequencer(self, rate='30Hz', readout_all=False):
        """
        Setup EventSequencer (30Hz default) with event codes to tag
        the Rayonix readout and each of the preceeding 3 shots.

        Parameters
        ----------
        rate : str, optional
            default is "30Hz", or optionally "10Hz"

        readout_all : bool, optional
            Readout all events with ec198 if True
            otherwise readout only ec198 at same time as Rayonix ec210

        """
        logger.info("Configure EventSequencer ...")
        # Setup sequencer
        sequencer.sync_marker.put(rate)
        if rate == '10Hz':
            delta0 = 120 / 10
        elif rate == '30Hz':
            delta0 = 120 / 30
        else:
            delta0 = 120 / 30

        # Set sequence
        #   delta0 is the number of shots until the next event code
        #   for the desired rate, e.g., ec42 for 30 Hz and ec43 for 10 Hz
        #
        seqstep = 0
        seq_steps[seqstep].configure({
            'eventcode': 213,
            'delta_beam': delta0 - 3,
            'fiducial': 0,
            'comment': 'Rayonix-3'
        })
        seqstep += 1
        seq_steps[seqstep].configure({
            'eventcode': 197,
            'delta_beam': 1,
            'fiducial': 0,
            'comment': 'PulsePicker'
        })
        if readout_all:
            seqstep += 1
            seq_steps[seqstep].configure({
                'eventcode': 198,
                'delta_beam': 0,
                'fiducial': 0,
                'comment': 'DAQ Readout'
            })

        seqstep += 1
        seq_steps[seqstep].configure({
            'eventcode': 212,
            'delta_beam': 0,
            'fiducial': 0,
            'comment': 'Rayonix-2'
        })
        if readout_all:
            seqstep += 1
            seq_steps[seqstep].configure({
                'eventcode': 198,
                'delta_beam': 0,
                'fiducial': 0,
                'comment': 'DAQ Readout'
            })

        seqstep += 1
        seq_steps[seqstep].configure({
            'eventcode': 211,
            'delta_beam': 1,
            'fiducial': 0,
            'comment': 'Rayonix-1'
        })
        if readout_all:
            seqstep += 1
            seq_steps[seqstep].configure({
                'eventcode': 198,
                'delta_beam': 0,
                'fiducial': 0,
                'comment': 'DAQ Readout'
            })

        seqstep += 1
        seq_steps[seqstep].configure({
            'eventcode': 210,
            'delta_beam': 1,
            'fiducial': 0,
            'comment': 'Rayonix'
        })
        if readout_all:
            seqstep += 1
            seq_steps[seqstep].configure({
                'eventcode': 198,
                'delta_beam': 0,
                'fiducial': 0,
                'comment': 'DAQ Readout'
            })

        seqstep += 1
        seq_steps[seqstep].configure({
            'eventcode': 198,
            'delta_beam': 0,
            'fiducial': 0,
            'comment': 'DAQ Readout'
        })
        # Clear other sequence steps
        seqstep += 1
        sequencer.sequence_length.put(seqstep)
        for i in range(seqstep, 20):
            seq_steps[i].clear()

    ######################
    # Scanning Functions #
    ######################
    def perform_run(self,
                    events,
                    record=True,
                    comment='',
                    post=True,
                    **kwargs):
        """
        Perform a single run of the experiment

        Parameters
        ----------
        events: int
            Number of events to include in run

        record: bool, optional
            Whether to record the run

        comment : str, optional
            Comment for ELog

        post: bool, optional
            Whether to post to the experimental ELog or not. Will not post if
            not recording

        """
        # time.sleep(3) / a leftover from original script
        # Create descriptive message
        comment = comment or ''
        # Start recording
        try:
            logger.info("Starting DAQ run, -> record=%s", record)
            daq.begin(events=events, record=record)
            time.sleep(
                2)  # Wait for the DAQ to get spinnign before sending events
            logger.debug("Starting EventSequencer ...")
            sequencer.start()
            time.sleep(1)
            # Post to ELog if desired
            runnum = daq._control.runnumber()
            info = [runnum, comment, events, self.current_rate]
            post_msg = post_template.format(*info)
            print(post_msg)
            if post and record:
                elog.post(post_msg, run=runnum)
            # Wait for the DAQ to finish
            logger.info("Waiting or DAQ to complete %s events ...", events)
            daq.wait()
            logger.info("Run complete!")
            daq.end_run()
            logger.debug("Stopping Sequencer ...")
            sequencer.stop()
            # allow short time after sequencer stops
            time.sleep(0.5)
        except KeyboardInterrupt:
            logger.warning("Scan interrupted by user request!")
            logger.info("Stopping DAQ ...")
            daq.stop()
        # Return the DAQ to the original state
        finally:
            logger.info("Disconnecting from DAQ ...")
            daq.disconnect()
            logger.info("Closing all laser shutters ...")
            self.configure_shutters(pulse1=False,
                                    pulse2=False,
                                    pulse3=False,
                                    opo=False)
            logger.info("Restarting the EventSequencer ...")
            sequencer.start()

    def get_mesh_voltage(self):
        """
        Get the current power supply voltage
        """
        return self.mesh_raw.get()

    def set_mesh_voltage(self, sigIn, wait=True, do_print=True):
        """
        Set voltage on power supply to an absolute value

        Parameters
        ----------
        sigIn: int or float
            Power supply voltage in Volts
        """
        if do_print:
            print('Setting voltage...')
        sigInScaled = sigIn / self.SCALE  # in V
        self.mesh_raw.put(sigInScaled)
        if wait:
            time.sleep(2.5)
        finalVolt = self.mesh_raw.get()
        finalVoltSupply = finalVolt * self.SCALE
        if do_print:
            print('Power Supply Setpoint: %s V' % sigIn)
            print('Power Supply Voltage: %s V' % finalVoltSupply)

    def set_rel_mesh_voltage(self, deltaVolt, wait=True, do_print=True):
        """
        Increase/decrease power supply voltage by a specified amount

        Parameters
        ----------
        deltaVolt: int or float
            Amount to increase/decrease voltage (in Volts) from
            its current value. Use positive value to increase
            and negative value to decrease
        """
        if do_print:
            print('Setting voltage...')
        curr_set = self.mesh_raw.get_setpoint()
        curr_set_supply = curr_set * self.SCALE
        if do_print:
            print('Previous Power Supply Setpoint: %s V' % curr_set_supply)
        new_voltage = round(curr_set_supply + deltaVolt)
        self.set_mesh_voltage(new_voltage, wait=wait, do_print=do_print)

    def tweak_mesh_voltage(self, deltaVolt):
        """
        Continuously Increase/decrease power supply voltage by
        specifed amount using arrow keys

        Parameters
        ----------
        deltaVolt: int or float
            Amount to change voltage (in Volts) from its current value at
            each step. After calling with specified step size, use arrow keys
            to keep changing
        ^C:
            exits tweak mode
        """
        print('Use arrow keys (left, right) to step voltage (-, +)')
        while True:
            key = key_press.get_input()
            if key in ('q', None):
                return
            elif key == key_press.arrow_right:
                self.set_rel_mesh_voltage(deltaVolt,
                                          wait=False,
                                          do_print=False)
            elif key == key_press.arrow_left:
                self.set_rel_mesh_voltage(-deltaVolt,
                                          wait=False,
                                          do_print=False)
Exemple #2
0
class User:
    """Generic User Object"""
    def __init__(self):
        self.sc1_mesh_raw = EpicsSignal(name='sc1_mesh_raw',
                                        read_pv='CXI:SC1:AIO:04:RAW:ANALOGIN',
                                        write_pv='CXI:SC1:AIO:04:ANALOGOUT')
        self.sc1_mesh_scale = EpicsSignal(name='sc1_mesh_scale',
                                          read_pv='CXI:SC1:AIO:04:SCALE')

    def get_sc1_mesh_voltage(self):
        """
        Get the current power supply voltage
        """
        return self.sc1_mesh_raw.get()

    def set_sc1_mesh_voltage(self, sigIn, wait=True, do_print=True):
        """
        Set voltage on power supply to an absolute value

        Parameters
        ----------
        sigIn: int or float
            Power supply voltage in Volts
        """
        if do_print:
            print('Setting voltage...')
        sigInScaled = sigIn / self.sc1_mesh_scale.get()  # in V
        self.sc1_mesh_raw.put(sigInScaled)
        if wait:
            time.sleep(2.5)
        finalVolt = self.sc1_mesh_raw.get()
        finalVoltSupply = finalVolt * self.sc1_mesh_scale.get()
        if do_print:
            print('Power Supply Setpoint: %s V' % sigIn)
            print('Power Supply Voltage: %s V' % finalVoltSupply)

    def set_sc1_rel_mesh_voltage(self, deltaVolt, wait=True, do_print=True):
        """
        Increase/decrease power supply voltage by a specified amount

        Parameters
        ----------
        deltaVolt: int or float
            Amount to increase/decrease voltage (in Volts) from
            its current value. Use positive value to increase
            and negative value to decrease
        """
        if do_print:
            print('Setting voltage...')
        curr_set = self.sc1_mesh_raw.get_setpoint()
        curr_set_supply = curr_set * self.sc1_mesh_scale.get()
        if do_print:
            print('Previous Power Supply Setpoint: %s V' % curr_set_supply)
        new_voltage = round(curr_set_supply + deltaVolt)
        self.set_sc1_mesh_voltage(new_voltage, wait=wait, do_print=do_print)

    def tweak_mesh_voltage(self, deltaVolt):
        """
        Continuously Increase/decrease power supply voltage by
        specifed amount using arrow keys

        Parameters
        ----------
        deltaVolt: int or float
            Amount to change voltage (in Volts) from its current value at
            each step. After calling with specified step size, use arrow keys
            to keep changing
        ^C:
            exits tweak mode
        """
        print('Use arrow keys (left, right) to step voltage (-, +)')
        while True:
            key = key_press.get_input()
            if key in ('q', None):
                return
            elif key == key_press.arrow_right:
                self.set_sc1_rel_mesh_voltage(deltaVolt,
                                              wait=False,
                                              do_print=False)
            elif key == key_press.arrow_left:
                self.set_sc1_rel_mesh_voltage(-deltaVolt,
                                              wait=False,
                                              do_print=False)