Skip to content

Mfx timing

MFX_Timing

Source code in mfx/mfx_timing.py
class MFX_Timing:
    def __init__(self,sequencer=None):
        from pcdsdevices.sequencer import EventSequencer
        self.seq1 = EventSequencer('ECS:SYS0:7', name='mfx_sequencer')
        self.seq2 = EventSequencer('ECS:SYS0:12', name='mfx_sequencer_spare')

        self.evt_code = {
            'wait':0,
            'pp_trig':197,
            'daq_readout':198,
            'laser_on':203,
            'laser_off':204,
            'ray_readout':210,
            'ray1':211,
            'ray2':212,
            'ray3':213,
        }
        self.sync_markers = {0.5:0, 1:1, 5:2, 10:3, 30:4, 60:5, 120:6, 360:7}
        self.sequence = []


    def _seq_step(self, evt_code_name=None, delta_beam=0):
        try:
            return [self.evt_code[evt_code_name], delta_beam, 0, 0]
        except:
            print('Error: event sequencer step not recognized.')


    def _seq_init(self, sync_mark=30):
        from time import sleep
        self.seq.sync_marker.put(self.sync_markers[sync_mark])
        self.sequence = []
        sequence = []
        for ii in range(15):
            sequence.append(self._seq_step('wait', 0))
        self.seq.sequence.put_seq(sequence)
        sleep(1)


    def _seq_put(self, steps):
        for step in steps:
            self.sequence.append(self._seq_step(step[0], step[1]))
        self.seq.sequence.put_seq(self.sequence)


    def _seq_120hz(self):
        steps = [['ray_readout', 1],
                 ['daq_readout',0],
                 ['ray1',1],
                 ['daq_readout',0],
                 ['ray2',1],
                 ['daq_readout',0],
                 ['ray3',1],
                 ['daq_readout', 0]]
        return steps


    def _seq_120hz_trucated(self):
        steps = [['ray_readout', 1],
                 ['daq_readout',0]]
        return steps


    def _seq_60hz(self):
        steps = [['ray_readout', 1],
                 ['pp_trig', 0],
                 ['ray1', 1],
                 ['daq_readout', 0],
                 ['ray2', 1],
                 ['pp_trig', 0],
                 ['ray3', 1],
                 ['daq_readout', 0]]
        return steps


    def _seq_60hz_trucated(self):
        steps = [['ray_readout', 1],
                 ['ray1', 0],
                 ['ray2', 1],
                 ['daq_readout', 0]]
        return steps


    def _seq_30hz(self):
        steps = [['ray_readout', 1],
                 ['pp_trig', 0],
                 ['ray1', 1],
                 ['ray2', 1],
                 ['daq_readout', 0],
                 ['ray3', 1]]
        return steps


    def _seq_20hz(self):
        steps = [['ray_readout', 1],
                 ['pp_trig', 0],
                 ['ray1', 1],
                 ['ray2', 1],
                 ['daq_readout', 0],
                 ['ray3', 1],
                 ['ray3', 1],
                 ['ray3', 1]]
        return steps


    def set_seq(self, rep=None, sequencer=None, laser=None):
        """
    Set your event sequencer

    Parameters
    ----------
    rep: int, optional
        Set repitition rate only 120, 60, 30, and 20 Hz are currently available

    sequencer: str, optional
        default is event sequencer 7 and use 'spare' to run sequencer 12

    laser: list, optional
        sets laser sequence list in format [['laser_on',0],['laser_off',0],...]

    Operations
    ----------

        """
        self.seq1.stop()
        self.seq2.stop()
        if str(sequencer).lower() == 'spare':
            self.seq = self.seq2
        else:
            self.seq = self.seq1
        if laser:
            if rep is None or rep == 120:
                self._seq_init(sync_mark=120)
                for laser_evt in laser:
                    sequence = self._seq_120hz_trucated()
                    block = sequence[:-1]
                    block.append(laser_evt)
                    block.append(sequence[-1])
                    self._seq_put(block)
            elif rep == 60:
                self._seq_init(sync_mark=120)
                for laser_evt in laser:
                    sequence = self._seq_60hz_trucated()
                    block = sequence[:-1]
                    block.append(laser_evt)
                    block.append(sequence[-1])
                    self._seq_put(block)
            elif rep == 30:
                self._seq_init(sync_mark=30)
                for laser_evt in laser:
                    sequence = self._seq_30hz()
                    block = sequence[:-1]
                    block.append(laser_evt)
                    block.append(sequence[-1])
                    self._seq_put(block)
            elif rep == 20:
                self._seq_init(sync_mark=60)
                for laser_evt in laser:
                    sequence = self._seq_20hz()
                    block = sequence[:-1]
                    block.append(laser_evt)
                    block.append(sequence[-1])
                    self._seq_put(block)
        else:
            if rep is None or rep == 120:
                self._seq_init(sync_mark=120)
                self._seq_put(self._seq_120hz())
            elif rep == 60:
                self._seq_init(sync_mark=60)
                self._seq_put(self._seq_60hz())
            elif rep == 30:
                self._seq_init(sync_mark=30)
                self._seq_put(self._seq_30hz())
            elif rep == 20:
                self._seq_init(sync_mark=20)
                self._seq_put(self._seq_20hz())

        self.seq.start()
        return self.sequence

    def check_seq(self):
        for line in self.sequence:
            print(line)

set_seq(rep=None, sequencer=None, laser=None)

Set your event sequencer

Parameters:

Name Type Description Default
rep

Set repitition rate only 120, 60, 30, and 20 Hz are currently available

None
sequencer

default is event sequencer 7 and use 'spare' to run sequencer 12

None
laser

sets laser sequence list in format [['laser_on',0],['laser_off',0],...]

None
Operations
Source code in mfx/mfx_timing.py
def set_seq(self, rep=None, sequencer=None, laser=None):
    """
Set your event sequencer

Parameters
----------
rep: int, optional
    Set repitition rate only 120, 60, 30, and 20 Hz are currently available

sequencer: str, optional
    default is event sequencer 7 and use 'spare' to run sequencer 12

laser: list, optional
    sets laser sequence list in format [['laser_on',0],['laser_off',0],...]

Operations
----------

    """
    self.seq1.stop()
    self.seq2.stop()
    if str(sequencer).lower() == 'spare':
        self.seq = self.seq2
    else:
        self.seq = self.seq1
    if laser:
        if rep is None or rep == 120:
            self._seq_init(sync_mark=120)
            for laser_evt in laser:
                sequence = self._seq_120hz_trucated()
                block = sequence[:-1]
                block.append(laser_evt)
                block.append(sequence[-1])
                self._seq_put(block)
        elif rep == 60:
            self._seq_init(sync_mark=120)
            for laser_evt in laser:
                sequence = self._seq_60hz_trucated()
                block = sequence[:-1]
                block.append(laser_evt)
                block.append(sequence[-1])
                self._seq_put(block)
        elif rep == 30:
            self._seq_init(sync_mark=30)
            for laser_evt in laser:
                sequence = self._seq_30hz()
                block = sequence[:-1]
                block.append(laser_evt)
                block.append(sequence[-1])
                self._seq_put(block)
        elif rep == 20:
            self._seq_init(sync_mark=60)
            for laser_evt in laser:
                sequence = self._seq_20hz()
                block = sequence[:-1]
                block.append(laser_evt)
                block.append(sequence[-1])
                self._seq_put(block)
    else:
        if rep is None or rep == 120:
            self._seq_init(sync_mark=120)
            self._seq_put(self._seq_120hz())
        elif rep == 60:
            self._seq_init(sync_mark=60)
            self._seq_put(self._seq_60hz())
        elif rep == 30:
            self._seq_init(sync_mark=30)
            self._seq_put(self._seq_30hz())
        elif rep == 20:
            self._seq_init(sync_mark=20)
            self._seq_put(self._seq_20hz())

    self.seq.start()
    return self.sequence