Skip to content

Mfx timing

MFX_Timing

Source code in mfx/mfx_timing.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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

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

str, optional

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

list, optional

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

Operations
Source code in mfx/mfx_timing.py
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
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