File: ad_perkinelmer.py

package info (click to toggle)
python-pyepics 3.5.7%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,336 kB
  • sloc: python: 10,539; makefile: 112; javascript: 104; sh: 53
file content (189 lines) | stat: -rw-r--r-- 6,417 bytes parent folder | download | duplicates (2)
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
184
185
186
187
188
189
#!/usr/bin/python
import sys
import time
from .. import Device

class AD_PerkinElmer(Device):
    camattrs = ('PEAcquireOffset', 'PENumOffsetFrames',
                'ImageMode', 'TriggerMode',
                'Acquire',  'AcquireTime', 'Model_RBV',
                'NumImages', 'ShutterControl', 'ShutterMode')

    pathattrs = ('FilePath', 'FileTemplate', 'FileWriteMode',
                 'FileName', 'FileNumber', 'FullFileName_RBV',
                 'Capture',  'Capture_RBV', 'NumCapture', 'WriteFile_RBV',
                 'AutoSave', 'EnableCallbacks',  'ArraySize0_RBV',
                 'FileTemplate_RBV', 'FileName_RBV', 'AutoIncrement')

    _nonpvs  = ('_prefix', '_pvs', '_delim', 'filesaver',
                'camattrs', 'pathattrs', '_nonpvs')

    def __init__(self,prefix, filesaver='netCDF1:'):
        camprefix = prefix + 'cam1:'
        Device.__init__(self, camprefix, delim='',
                        mutable=False,
                        attrs=self.camattrs)
        self.filesaver = "%s%s" % (prefix, filesaver)
        for p in self.pathattrs:
            pvname = '%s%s%s' % (prefix, filesaver, p)
            self.add_pv(pvname, attr='File_'+p)


    def AcquireOffset(self, timeout=10, open_shutter=True):
        """Acquire Offset -- a slightly complex process

        Arguments
        ---------
        timeout :       float (default 10)  time in seconds to wait
        open_shutter :  bool (default True)  open shutters on exit

        1. close shutter
        2. set image mode to single /internal trigger
        3. acquire offset correction
        4. reset image mode and trigger mode
        5. optionally (by default) open shutter
        """
        self.ShutterMode = 1
        self.ShutterControl = 0
        image_mode_save = self.ImageMode
        trigger_mode_save = self.TriggerMode
        self.ImageMode = 0
        self.TriggerMode = 0
        offtime = self.PENumOffsetFrames * self.AcquireTime
        time.sleep(0.50)
        self.PEAcquireOffset = 1
        t0 = time.time()
        time.sleep(offtime/3.0)
        while self.PEAcquireOffset > 0 and time.time()-t0 < timeout+offtime:
            time.sleep(0.1)
        time.sleep(1.00)
        self.ImageMode = image_mode_save
        self.TriggerMode = trigger_mode_save
        time.sleep(1.00)
        if open_shutter:
            self.ShutterControl = 1
        self.ShutterMode = 0
        time.sleep(1.00)

    def SetExposureTime(self, t, open_shutter=True):
        "set exposure time, re-acquire offset correction"
        self.AcquireTime = t
        self.AcquireOffset(open_shutter=open_shutter)

    def SetMultiFrames(self, n, trigger='external'):
        """set number of multiple frames for streaming
        this sets number of images for camera in Multiple Image Mode
        AND sets the number of images to capture with file plugin
        """
        self.ImageMode = 1  #  multiple images

        # trigger mode
        trigger_mode = 0 # internal
        if trigger.lower().startswith('ext'):
            trigger_mode = 1 # external
        elif trigger.lower().startswith('free'):
            trigger_mode = 2 # free running
        elif trigger.lower().startswith('soft'):
            trigger_mode = 3 # soft trigger
        time.sleep(0.1)

        self.TriggerMode = trigger_mode
        # number of images for collection and streaming
        self.NumImages  = n
        # set filesaver
        self.filePut('NumCapture',    n)
        self.filePut('EnableCallbacks', 1)
        self.filePut('FileNumber',    1)
        self.filePut('AutoIncrement', 1)
        time.sleep(2.0)

    def StartStreaming(self):
        """start streamed acquisition to save with
        file saving plugin, and start acquisition
        """
        self.ShutterMode = 0
        self.filePut('AutoSave', 1)
        self.filePut('FileWriteMode', 2)  # stream
        time.sleep(0.05)
        self.filePut('Capture', 1)  # stream
        self.Acquire = 1
        time.sleep(0.25)


    def FinishStreaming(self, timeout=5.0):
        """start streamed acquisition to save with
        file saving plugin, and start acquisition
        """
        t0 = time.time()
        capture_on = self.fileGet('Capture_RBV')
        while capture_on==1 and time.time() - t0 < timeout:
            time.sleep(0.05)
            capture_on = self.fileGet('Capture_RBV')
        if capture_on != 0:
            print( 'Forcing XRD Streaming to stop')
            self.filePut('Capture', 0)
            t0 = time.time()
            while capture_on==1 and time.time() - t0 < timeout:
                time.sleep(0.05)
                capture_on = self.fileGet('Capture_RBV')
        time.sleep(0.50)


    def filePut(self, attr, value, **kw):
        return self.put("File_%s" % attr, value, **kw)

    def fileGet(self, attr, **kw):
        return self.get("File_%s" % attr, **kw)

    def setFilePath(self, pathname):
        return self.filePut('FilePath', pathname)

    def setFileTemplate(self, fmt):
        return self.filePut('FileTemplate', fmt)

    def setFileWriteMode(self, mode):
        return self.filePut('FileWriteMode', mode)

    def setFileName(self, fname):
        return self.filePut('FileName', fname)

    def nextFileNumber(self):
        self.setFileNumber(1+self.fileGet('FileNumber'))

    def setFileNumber(self, fnum=None):
        if fnum is None:
            self.filePut('AutoIncrement', 1)
        else:
            self.filePut('AutoIncrement', 0)
            return self.filePut('FileNumber',fnum)

    def getLastFileName(self):
        return self.fileGet('FullFileName_RBV',as_string=True)

    def FileCaptureOn(self):
        return self.filePut('Capture', 1)

    def FileCaptureOff(self):
        return self.filePut('Capture', 0)

    def setFileNumCapture(self,n):
        return self.filePut('NumCapture', n)

    def FileWriteComplete(self):
        return (0==self.fileGet('WriteFile_RBV') )

    def getFileTemplate(self):
        return self.fileGet('FileTemplate_RBV',as_string=True)

    def getFileName(self):
        return self.fileGet('FileName_RBV',as_string=True)

    def getFileNumber(self):
        return self.fileGet('FileNumber_RBV')

    def getFilePath(self):
        return self.fileGet('FilePath_RBV',as_string=True)

    def getFileNameByIndex(self,index):
        return self.getFileTemplate() % (self.getFilePath(), self.getFileName(), index)