pychemstation 0.10.10__py3-none-any.whl → 0.10.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pychemstation/control/controllers/comm.py +1 -1
- pychemstation/control/controllers/data_aq/method.py +128 -211
- pychemstation/control/controllers/data_aq/sequence.py +74 -51
- pychemstation/control/controllers/devices/column.py +61 -0
- pychemstation/control/controllers/devices/dad.py +85 -0
- pychemstation/control/controllers/devices/injector.py +20 -12
- pychemstation/control/controllers/devices/pump.py +131 -0
- pychemstation/control/controllers/devices/sample_info.py +27 -0
- pychemstation/control/hplc.py +36 -12
- pychemstation/utils/abc_tables/device.py +17 -3
- pychemstation/utils/abc_tables/table.py +166 -75
- pychemstation/utils/device_types.py +66 -0
- pychemstation/utils/macro.py +2 -0
- pychemstation/utils/table_types.py +65 -8
- {pychemstation-0.10.10.dist-info → pychemstation-0.10.12.dist-info}/METADATA +2 -2
- {pychemstation-0.10.10.dist-info → pychemstation-0.10.12.dist-info}/RECORD +18 -14
- {pychemstation-0.10.10.dist-info → pychemstation-0.10.12.dist-info}/WHEEL +0 -0
- {pychemstation-0.10.10.dist-info → pychemstation-0.10.12.dist-info}/licenses/LICENSE +0 -0
@@ -7,14 +7,16 @@ Authors: Lucy Hao
|
|
7
7
|
from __future__ import annotations
|
8
8
|
|
9
9
|
import abc
|
10
|
+
from abc import abstractmethod
|
11
|
+
from collections.abc import Callable
|
10
12
|
from typing import Optional, Union
|
11
13
|
|
12
14
|
from result import Err, Result
|
13
15
|
|
14
16
|
from ..macro import Command, Response
|
15
|
-
from ..method_types import MethodDetails
|
17
|
+
from ..method_types import MethodDetails, PType, Param
|
16
18
|
from ..sequence_types import SequenceTable
|
17
|
-
from ..table_types import Table, RegisterFlag, TableOperation
|
19
|
+
from ..table_types import Table, RegisterFlag, TableOperation, Device
|
18
20
|
from ...control.controllers import CommunicationController
|
19
21
|
|
20
22
|
TableType = Union[MethodDetails, SequenceTable]
|
@@ -29,7 +31,7 @@ class ABCTableController(abc.ABC):
|
|
29
31
|
def __init__(
|
30
32
|
self,
|
31
33
|
controller: Optional[CommunicationController],
|
32
|
-
table: Table,
|
34
|
+
table: Table | Device,
|
33
35
|
):
|
34
36
|
self.controller = controller
|
35
37
|
self.table_locator = table
|
@@ -40,6 +42,14 @@ class ABCTableController(abc.ABC):
|
|
40
42
|
raise TypeError(f"only children of '{cls.__name__}' may be instantiated")
|
41
43
|
return object.__new__(cls, *args, **kwargs)
|
42
44
|
|
45
|
+
@abstractmethod
|
46
|
+
def download(self):
|
47
|
+
pass
|
48
|
+
|
49
|
+
@abc.abstractmethod
|
50
|
+
def get_row(self, row: int):
|
51
|
+
pass
|
52
|
+
|
43
53
|
def receive(self) -> Result[Response, str]:
|
44
54
|
if self.controller:
|
45
55
|
for _ in range(10):
|
@@ -72,7 +82,7 @@ class ABCTableController(abc.ABC):
|
|
72
82
|
self.send(Command.SLEEP_CMD.value.format(seconds=seconds))
|
73
83
|
|
74
84
|
def get_num(self, row: int, col_name: RegisterFlag) -> Union[int, float]:
|
75
|
-
if self.controller:
|
85
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
76
86
|
return self.controller.get_num_val(
|
77
87
|
TableOperation.GET_ROW_VAL.value.format(
|
78
88
|
register=self.table_locator.register,
|
@@ -85,7 +95,7 @@ class ABCTableController(abc.ABC):
|
|
85
95
|
raise ValueError("Controller is offline")
|
86
96
|
|
87
97
|
def get_text(self, row: int, col_name: RegisterFlag) -> str:
|
88
|
-
if self.controller:
|
98
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
89
99
|
return self.controller.get_text_val(
|
90
100
|
TableOperation.GET_ROW_TEXT.value.format(
|
91
101
|
register=self.table_locator.register,
|
@@ -100,91 +110,106 @@ class ABCTableController(abc.ABC):
|
|
100
110
|
def add_new_col_num(self, col_name: RegisterFlag, val: Union[int, float]):
|
101
111
|
if not (isinstance(val, int) or isinstance(val, float)):
|
102
112
|
raise ValueError(f"{val} must be an int or float.")
|
103
|
-
self.
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
113
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
114
|
+
self.sleepy_send(
|
115
|
+
TableOperation.NEW_COL_VAL.value.format(
|
116
|
+
register=self.table_locator.register,
|
117
|
+
table_name=self.table_locator.name,
|
118
|
+
col_name=col_name,
|
119
|
+
val=val,
|
120
|
+
)
|
109
121
|
)
|
110
|
-
|
122
|
+
else:
|
123
|
+
raise ValueError("require table, not device")
|
111
124
|
|
112
125
|
def add_new_col_text(self, col_name: RegisterFlag, val: str):
|
113
126
|
if not isinstance(val, str):
|
114
127
|
raise ValueError(f"{val} must be a str.")
|
115
|
-
self.
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
128
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
129
|
+
self.sleepy_send(
|
130
|
+
TableOperation.NEW_COL_TEXT.value.format(
|
131
|
+
register=self.table_locator.register,
|
132
|
+
table_name=self.table_locator.name,
|
133
|
+
col_name=col_name,
|
134
|
+
val=val,
|
135
|
+
)
|
121
136
|
)
|
122
|
-
|
137
|
+
else:
|
138
|
+
raise ValueError("require table not device")
|
123
139
|
|
124
140
|
def _edit_row_num(
|
125
141
|
self, col_name: RegisterFlag, val: Union[int, float], row: Optional[int] = None
|
126
142
|
):
|
127
143
|
if not (isinstance(val, int) or isinstance(val, float)):
|
128
144
|
raise ValueError(f"{val} must be an int or float.")
|
129
|
-
num_rows = self.
|
130
|
-
if row:
|
131
|
-
|
132
|
-
if num_rows.ok_value.num_response < row:
|
133
|
-
raise ValueError("Not enough rows to edit!")
|
145
|
+
num_rows = self.get_row_count_safely()
|
146
|
+
if row and num_rows < row:
|
147
|
+
raise ValueError("Not enough rows to edit!")
|
134
148
|
|
135
|
-
self.
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
149
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
150
|
+
self.sleepy_send(
|
151
|
+
TableOperation.EDIT_ROW_VAL.value.format(
|
152
|
+
register=self.table_locator.register,
|
153
|
+
table_name=self.table_locator.name,
|
154
|
+
row=row if row is not None else "response_num",
|
155
|
+
col_name=col_name,
|
156
|
+
val=val,
|
157
|
+
)
|
142
158
|
)
|
143
|
-
)
|
144
159
|
|
145
160
|
def _edit_row_text(
|
146
161
|
self, col_name: RegisterFlag, val: str, row: Optional[int] = None
|
147
162
|
):
|
148
163
|
if not isinstance(val, str):
|
149
164
|
raise ValueError(f"{val} must be a str.")
|
150
|
-
num_rows = self.
|
151
|
-
if row:
|
152
|
-
|
153
|
-
if num_rows.ok_value.num_response < row:
|
154
|
-
raise ValueError("Not enough rows to edit!")
|
165
|
+
num_rows = self.get_row_count_safely()
|
166
|
+
if row and num_rows < row:
|
167
|
+
raise ValueError("Not enough rows to edit!")
|
155
168
|
|
156
|
-
self.
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
169
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
170
|
+
self.sleepy_send(
|
171
|
+
TableOperation.EDIT_ROW_TEXT.value.format(
|
172
|
+
register=self.table_locator.register,
|
173
|
+
table_name=self.table_locator.name,
|
174
|
+
row=row if row is not None else "response_num",
|
175
|
+
col_name=col_name,
|
176
|
+
val=val,
|
177
|
+
)
|
163
178
|
)
|
164
|
-
)
|
165
|
-
|
166
|
-
@abc.abstractmethod
|
167
|
-
def get_row(self, row: int):
|
168
|
-
pass
|
169
179
|
|
170
180
|
def delete_row(self, row: int):
|
171
|
-
self.
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
181
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
182
|
+
self.sleepy_send(
|
183
|
+
TableOperation.DELETE_ROW.value.format(
|
184
|
+
register=self.table_locator.register,
|
185
|
+
table_name=self.table_locator.name,
|
186
|
+
row=row,
|
187
|
+
)
|
176
188
|
)
|
177
|
-
|
189
|
+
else:
|
190
|
+
raise ValueError("controller is offline or given device, need table")
|
191
|
+
|
192
|
+
def get_row_count_safely(self) -> int:
|
193
|
+
row_count = self.get_num_rows()
|
194
|
+
tries = 10
|
195
|
+
i = 0
|
196
|
+
while row_count.is_err() and i < tries:
|
197
|
+
row_count = self.get_num_rows()
|
198
|
+
i += 1
|
199
|
+
if row_count.is_ok():
|
200
|
+
return int(row_count.ok_value.num_response)
|
201
|
+
else:
|
202
|
+
raise ValueError("couldn't read row count, table might not exist")
|
178
203
|
|
179
204
|
def add_row(self):
|
180
205
|
"""Adds a row to the provided table for currently loaded method or sequence."""
|
181
|
-
previous_row_count = self.
|
206
|
+
previous_row_count = self.get_row_count_safely()
|
182
207
|
self.sleepy_send(
|
183
208
|
TableOperation.NEW_ROW.value.format(
|
184
209
|
register=self.table_locator.register, table_name=self.table_locator.name
|
185
210
|
)
|
186
211
|
)
|
187
|
-
new_row_count = self.
|
212
|
+
new_row_count = self.get_row_count_safely()
|
188
213
|
if previous_row_count + 1 != new_row_count:
|
189
214
|
raise ValueError("Row could not be added.")
|
190
215
|
|
@@ -205,29 +230,95 @@ class ABCTableController(abc.ABC):
|
|
205
230
|
)
|
206
231
|
|
207
232
|
def get_num_rows(self) -> Result[Response, str]:
|
208
|
-
self.
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
233
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
234
|
+
self.send(
|
235
|
+
Command.GET_ROWS_CMD.value.format(
|
236
|
+
register=self.table_locator.register,
|
237
|
+
table_name=self.table_locator.name,
|
238
|
+
col_name=RegisterFlag.NUM_ROWS,
|
239
|
+
)
|
213
240
|
)
|
214
|
-
)
|
215
|
-
if self.controller:
|
216
241
|
res = self.controller.receive()
|
242
|
+
if res.is_ok():
|
243
|
+
return res
|
244
|
+
else:
|
245
|
+
return Err("No rows could be read.")
|
217
246
|
else:
|
218
|
-
raise ValueError(
|
247
|
+
raise ValueError(
|
248
|
+
"controller was offline or was given a device and not a table"
|
249
|
+
)
|
219
250
|
|
220
|
-
|
221
|
-
|
251
|
+
def move_row(self, from_row: int, to_row: int):
|
252
|
+
if isinstance(self.table_locator, Table) and self.controller:
|
253
|
+
self.send(
|
254
|
+
TableOperation.MOVE_ROW.value.format(
|
255
|
+
register=self.table_locator.register,
|
256
|
+
table_name=self.table_locator.name,
|
257
|
+
from_row=from_row,
|
258
|
+
to_row=to_row,
|
259
|
+
)
|
260
|
+
)
|
222
261
|
else:
|
223
|
-
|
262
|
+
raise ValueError("controller is offline or given device, need table")
|
224
263
|
|
225
|
-
def
|
226
|
-
self.
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
264
|
+
def _read_str_param(self, register_flag: RegisterFlag):
|
265
|
+
if self.controller:
|
266
|
+
try:
|
267
|
+
return self.controller.get_text_val(
|
268
|
+
cmd=TableOperation.GET_OBJ_HDR_TEXT.value.format(
|
269
|
+
register=self.table_locator.register,
|
270
|
+
register_flag=register_flag,
|
271
|
+
)
|
272
|
+
)
|
273
|
+
except RuntimeError:
|
274
|
+
return self.controller.get_text_val(
|
275
|
+
cmd=TableOperation.GET_OBJ_HDR_TEXT.value.format(
|
276
|
+
register=self.table_locator.register + "[2]",
|
277
|
+
register_flag=register_flag,
|
278
|
+
)
|
279
|
+
)
|
280
|
+
raise ValueError("Communication controller is not online!")
|
281
|
+
|
282
|
+
def _read_num_param(self, register_flag: RegisterFlag):
|
283
|
+
if self.controller:
|
284
|
+
return self.controller.get_num_val(
|
285
|
+
cmd=TableOperation.GET_OBJ_HDR_VAL.value.format(
|
286
|
+
register=self.table_locator.register,
|
287
|
+
register_flag=register_flag,
|
288
|
+
)
|
232
289
|
)
|
290
|
+
raise ValueError("Communication controller is not online!")
|
291
|
+
|
292
|
+
def _update_param(
|
293
|
+
self, param: Param, register_num: Optional[int] = None, sleep: bool = True
|
294
|
+
):
|
295
|
+
register = self.table_locator.register
|
296
|
+
setting_command = (
|
297
|
+
TableOperation.UPDATE_OBJ_HDR_VAL
|
298
|
+
if param.ptype == PType.NUM
|
299
|
+
else TableOperation.UPDATE_OBJ_HDR_TEXT
|
233
300
|
)
|
301
|
+
send_method: Callable = self.sleepy_send if sleep else self.send
|
302
|
+
if isinstance(param.chemstation_key, list):
|
303
|
+
for register_flag in param.chemstation_key:
|
304
|
+
send_method(
|
305
|
+
setting_command.value.format(
|
306
|
+
register=f"{register}[{str(register_num)}]"
|
307
|
+
if register_num
|
308
|
+
else register,
|
309
|
+
register_flag=register_flag,
|
310
|
+
val=param.val,
|
311
|
+
)
|
312
|
+
)
|
313
|
+
else:
|
314
|
+
register_flag = param.chemstation_key
|
315
|
+
send_method(
|
316
|
+
setting_command.value.format(
|
317
|
+
register=f"{register}[{str(register_num)}]"
|
318
|
+
if register_num
|
319
|
+
else register,
|
320
|
+
register_flag=register_flag,
|
321
|
+
val=param.val,
|
322
|
+
)
|
323
|
+
)
|
324
|
+
self.download()
|
@@ -1,7 +1,73 @@
|
|
1
1
|
from dataclasses import dataclass
|
2
|
+
from enum import Enum
|
3
|
+
from typing import Optional
|
2
4
|
|
3
5
|
|
4
6
|
@dataclass
|
7
|
+
class DADChannels:
|
8
|
+
A: int
|
9
|
+
A_ON: bool
|
10
|
+
B: int
|
11
|
+
B_ON: bool
|
12
|
+
C: int
|
13
|
+
C_ON: bool
|
14
|
+
D: int
|
15
|
+
D_ON: bool
|
16
|
+
E: int
|
17
|
+
E_ON: bool
|
18
|
+
|
19
|
+
|
20
|
+
class DADChannel(Enum):
|
21
|
+
A = "A"
|
22
|
+
B = "B"
|
23
|
+
C = "C"
|
24
|
+
D = "D"
|
25
|
+
E = "E"
|
26
|
+
|
27
|
+
|
28
|
+
class PumpPosition(Enum):
|
29
|
+
ONE = 1
|
30
|
+
TWO = 2
|
31
|
+
|
32
|
+
@classmethod
|
33
|
+
def from_str(cls, pos):
|
34
|
+
match pos:
|
35
|
+
case "Position1":
|
36
|
+
return PumpPosition.ONE
|
37
|
+
case "Position2":
|
38
|
+
return PumpPosition.TWO
|
39
|
+
case _:
|
40
|
+
raise ValueError("Expected one of Position 1 or Position 2")
|
41
|
+
|
42
|
+
def to_str(self):
|
43
|
+
match self:
|
44
|
+
case PumpPosition.ONE:
|
45
|
+
return "Position1"
|
46
|
+
case PumpPosition.TWO:
|
47
|
+
return "Position2"
|
48
|
+
case _:
|
49
|
+
raise ValueError("Enum is one of ONE or TWO")
|
50
|
+
|
51
|
+
|
52
|
+
class PumpValve(Enum):
|
53
|
+
A = "A"
|
54
|
+
B = "B"
|
55
|
+
|
56
|
+
|
57
|
+
@dataclass
|
58
|
+
class SolventBottle:
|
59
|
+
absolute_filled: float
|
60
|
+
percent_filled: float
|
61
|
+
type: Optional[PumpValve]
|
62
|
+
in_use: bool
|
63
|
+
user_name: str
|
64
|
+
max_volume: Optional[float]
|
65
|
+
|
66
|
+
|
67
|
+
MaybeBottle = Optional[SolventBottle]
|
68
|
+
MaybePumpPosition = Optional[PumpPosition]
|
69
|
+
|
70
|
+
|
5
71
|
class SignalRead:
|
6
72
|
on: bool
|
7
73
|
wavelength: int
|
pychemstation/utils/macro.py
CHANGED
@@ -33,6 +33,8 @@ class Command(Enum):
|
|
33
33
|
LAMP_OFF_CMD = "LampAll OFF"
|
34
34
|
PUMP_ON_CMD = "PumpAll ON"
|
35
35
|
PUMP_OFF_CMD = "PumpAll OFF"
|
36
|
+
COLUMN_ON_CMD = "ColumnAll ON"
|
37
|
+
COLUMN_OFF_CMD = "ColumnAll OFF"
|
36
38
|
INSTRUMENT_OFF = 'macro "SHUTDOWN.MAC" ,go'
|
37
39
|
INSTRUMENT_ON = 'LIDoOperation "TURN_ON"'
|
38
40
|
|
@@ -28,8 +28,8 @@ class TableOperation(Enum):
|
|
28
28
|
GET_NUM_ROWS = 'Rows = TabHdrVal({register}, "{table_name}", "{col_name}")'
|
29
29
|
GET_OBJ_HDR_VAL = 'ObjHdrVal("{register}", "{register_flag}")'
|
30
30
|
GET_OBJ_HDR_TEXT = 'ObjHdrText$("{register}", "{register_flag}")'
|
31
|
-
UPDATE_OBJ_HDR_VAL =
|
32
|
-
UPDATE_OBJ_HDR_TEXT =
|
31
|
+
UPDATE_OBJ_HDR_VAL = 'SetObjHdrVal "{register}", "{register_flag}", {val}'
|
32
|
+
UPDATE_OBJ_HDR_TEXT = 'SetObjHdrText "{register}", "{register_flag}", "{val}"'
|
33
33
|
NEW_COL_TEXT = 'NewColText {register}, "{table_name}", "{col_name}", "{val}"'
|
34
34
|
NEW_COL_VAL = 'NewColVal {register}, "{table_name}", "{col_name}", {val}'
|
35
35
|
|
@@ -42,6 +42,9 @@ class RegisterFlag(Enum):
|
|
42
42
|
def __str__(self):
|
43
43
|
return "%s" % self.value
|
44
44
|
|
45
|
+
# sample info
|
46
|
+
VIAL_NUMBER = "VialNumber"
|
47
|
+
|
45
48
|
# for table
|
46
49
|
NUM_ROWS = "NumberOfRows"
|
47
50
|
|
@@ -53,12 +56,6 @@ class RegisterFlag(Enum):
|
|
53
56
|
FLOW = "Flow"
|
54
57
|
MAX_TIME = "StopTime_Time"
|
55
58
|
POST_TIME = "PostTime_Time"
|
56
|
-
SIGNAL_A = "Signal_Wavelength"
|
57
|
-
SIGNAL_B = "Signal2_Wavelength"
|
58
|
-
SIGNAL_C = "Signal3_Wavelength"
|
59
|
-
SIGNAL_D = "Signal4_Wavelength"
|
60
|
-
SIGNAL_E = "Signal5_Wavelength"
|
61
|
-
SIGNAL_A_USED = "Signal1_IsUsed"
|
62
59
|
COLUMN_OVEN_TEMP1 = "TemperatureControl_Temperature"
|
63
60
|
COLUMN_OVEN_TEMP2 = "TemperatureControl2_Temperature"
|
64
61
|
STOPTIME_MODE = "StopTime_Mode"
|
@@ -100,6 +97,57 @@ class RegisterFlag(Enum):
|
|
100
97
|
## Remote
|
101
98
|
REMOTE = "RemoteLine"
|
102
99
|
REMOTE_DUR = "RemoteDuration"
|
100
|
+
# Injection Volume
|
101
|
+
INJECTION_VOLUME = "Injection_Volume"
|
102
|
+
|
103
|
+
## For Pump
|
104
|
+
### Volume Status
|
105
|
+
BOTTLE_A1_ABSOLUTE_FILLING = "BottleFilling_CurrentAbsolute"
|
106
|
+
BOTTLE_A1_PERCENT_FILLING = "BottleFilling_CurrentPercent"
|
107
|
+
BOTTLE_A1_MAX = "BottleFilling_MaximumAbsolute"
|
108
|
+
|
109
|
+
BOTTLE_A2_ABSOLUTE_FILLING = "BottleFilling2_CurrentAbsolute"
|
110
|
+
BOTTLE_A2_PERCENT_FILLING = "BottleFilling2_CurrentPercent"
|
111
|
+
BOTTLE_A2_MAX = "BottleFilling2_MaximumAbsolute"
|
112
|
+
|
113
|
+
BOTTLE_B1_ABSOLUTE_FILLING = "BottleFilling3_CurrentAbsolute"
|
114
|
+
BOTTLE_B1_PERCENT_FILLING = "BottleFilling3_CurrentPercent"
|
115
|
+
BOTTLE_B1_MAX = "BottleFilling3_MaximumAbsolute"
|
116
|
+
|
117
|
+
BOTTLE_B2_ABSOLUTE_FILLING = "BottleFilling4_CurrentAbsolute"
|
118
|
+
BOTTLE_B2_PERCENT_FILLING = "BottleFilling4_CurrentPercent"
|
119
|
+
BOTTLE_B2_MAX = "BottleFilling4_MaximumAbsolute"
|
120
|
+
|
121
|
+
WASTE_BOTTLE_ABSOLUTE = "WasteBottleFilling_CurrentAbsolute"
|
122
|
+
WASTE_BOTTLE_PERCENT = "WasteBottleFilling_CurrentPercent"
|
123
|
+
WASTE_BOTTLE_MAX = "WasteBottleFilling_MaximumPercent"
|
124
|
+
|
125
|
+
### Switching Solvent Bottles
|
126
|
+
PUMPCHANNEL_USED = "PumpChannel_IsUsed"
|
127
|
+
PUMPCHANNEL_SELECTION = "PumpChannel_SolventSelectionValvePosition"
|
128
|
+
BOTTLE_A1_USER_NAME = "PumpChannel_Position1_UserName"
|
129
|
+
BOTTLE_A2_USER_NAME = "PumpChannel_Position2_UserName"
|
130
|
+
PUMPCHANNEL2_USED = "PumpChannel_IsUsed"
|
131
|
+
PUMPCHANNEL2_SELECTION = "PumpChannel2_SolventSelectionValvePosition"
|
132
|
+
BOTTLE_B1_USER_NAME = "PumpChannel2_Position1_UserName"
|
133
|
+
BOTTLE_B2_USER_NAME = "PumpChannel2_Position2_UserName"
|
134
|
+
|
135
|
+
# For Column
|
136
|
+
AVAIL_COLUMN_DISPLAY_VALUES = "ColumnSwitchingValve_PositionDisplayValues"
|
137
|
+
AVAIL_COLUMN_POSITIONS = "ColumnSwitchingValve_PositionValues"
|
138
|
+
COLUMN_POSITION = "ColumnSwitchingValve_Position"
|
139
|
+
|
140
|
+
# For DAD
|
141
|
+
SIGNAL_A = "Signal_Wavelength"
|
142
|
+
SIGNAL_B = "Signal2_Wavelength"
|
143
|
+
SIGNAL_C = "Signal3_Wavelength"
|
144
|
+
SIGNAL_D = "Signal4_Wavelength"
|
145
|
+
SIGNAL_E = "Signal5_Wavelength"
|
146
|
+
SIGNAL_A_USED = "Signal_IsUsed"
|
147
|
+
SIGNAL_B_USED = "Signal2_IsUsed"
|
148
|
+
SIGNAL_C_USED = "Signal3_IsUsed"
|
149
|
+
SIGNAL_D_USED = "Signal4_IsUsed"
|
150
|
+
SIGNAL_E_USED = "Signal5_IsUsed"
|
103
151
|
|
104
152
|
|
105
153
|
@dataclass
|
@@ -112,4 +160,13 @@ class Table:
|
|
112
160
|
name: str
|
113
161
|
|
114
162
|
|
163
|
+
@dataclass
|
164
|
+
class Device:
|
165
|
+
"""
|
166
|
+
Class for storing the keys needed to access certain devices
|
167
|
+
"""
|
168
|
+
|
169
|
+
register: str
|
170
|
+
|
171
|
+
|
115
172
|
T = TypeVar("T")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pychemstation
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.12
|
4
4
|
Summary: Library to interact with Chemstation software, primarily used in Hein lab
|
5
5
|
Project-URL: Documentation, https://pychemstation-e5a086.gitlab.io/pychemstation.html
|
6
6
|
Project-URL: Repository, https://gitlab.com/heingroup/device-api/pychemstation
|
@@ -23,7 +23,7 @@ Requires-Dist: scipy>=1.10.1
|
|
23
23
|
Requires-Dist: xsdata>=24.9
|
24
24
|
Description-Content-Type: text/markdown
|
25
25
|
|
26
|
-
#
|
26
|
+
# pychemstation: A Python package for automated control of Chemstation using MACROs
|
27
27
|
|
28
28
|

|
29
29
|
|
@@ -5,38 +5,42 @@ pychemstation/analysis/chromatogram.py,sha256=Jk6xOMHA6kSV597fJDZgrFRlvVorldvK4z
|
|
5
5
|
pychemstation/analysis/process_report.py,sha256=GEazFm1asY1FZO87siiV9kWu2Wnbu7xwx86nlPeRexk,14728
|
6
6
|
pychemstation/control/README.md,sha256=ohPn3xhgjFyPraQqR4x9aZhurQVAOYuYHv-E8sj0eK4,3124
|
7
7
|
pychemstation/control/__init__.py,sha256=7lSkY7Qa7Ikdz82-2FESc_oqktv7JndsjltCkiMqnMI,147
|
8
|
-
pychemstation/control/hplc.py,sha256=
|
8
|
+
pychemstation/control/hplc.py,sha256=v0apEXVtTusvcVdgzY0Id4UJczKihFf-fjuFIJjAPEc,15213
|
9
9
|
pychemstation/control/controllers/README.md,sha256=S5cd4NJmPjs6TUH98BtPJJhiS1Lu-mxLCNS786ogOrQ,32
|
10
10
|
pychemstation/control/controllers/__init__.py,sha256=q2TUEie3J-OLlxcGLkG7vIy8fazCEhHm61OGzJPbhD0,179
|
11
|
-
pychemstation/control/controllers/comm.py,sha256=
|
11
|
+
pychemstation/control/controllers/comm.py,sha256=ldM9mPIiT8txTJL_OzXsEQwQXQL-Q-9CWY4aEFeDUDQ,6651
|
12
12
|
pychemstation/control/controllers/data_aq/__init__.py,sha256=w-Zgbit10niOQfz780ZmRHjUFxV1hMkdui7fOMPqeLA,132
|
13
|
-
pychemstation/control/controllers/data_aq/method.py,sha256=
|
14
|
-
pychemstation/control/controllers/data_aq/sequence.py,sha256=
|
13
|
+
pychemstation/control/controllers/data_aq/method.py,sha256=K9dMJG8DtsaM1q8kmyBLuilKD9RAd5FOBB91QnC3wr0,20709
|
14
|
+
pychemstation/control/controllers/data_aq/sequence.py,sha256=Jwt-qrWdsxAbxmDhR11CSlNS95rDfp5eeg_joOr5g2w,19215
|
15
15
|
pychemstation/control/controllers/devices/__init__.py,sha256=QpgGnLXyWiB96KIB98wMccEi8oOUUaLxvBCyevJzcOg,75
|
16
|
-
pychemstation/control/controllers/devices/
|
16
|
+
pychemstation/control/controllers/devices/column.py,sha256=RLGPQm2bzM5TVGDTrXGBiWY_epvy_bprKN2cG_DdrUI,2165
|
17
|
+
pychemstation/control/controllers/devices/dad.py,sha256=TEm4C01qdWlulwQ_uu0q7FmfHdJTXfzmvldc9LsKELk,3105
|
18
|
+
pychemstation/control/controllers/devices/injector.py,sha256=fRUBdnI6imZKz7VXP6x8nWPmZLQ97Nlk1a7GEfAnpug,4189
|
19
|
+
pychemstation/control/controllers/devices/pump.py,sha256=2YKuWJ2NRWttefZ2IbU6o5SqUVbaFNcAL7y4WWMlPkA,4977
|
20
|
+
pychemstation/control/controllers/devices/sample_info.py,sha256=-CJa425Hf_YgWoxqEmWXzjsrRArz6H7IyWF8PIMK5Hc,922
|
17
21
|
pychemstation/generated/__init__.py,sha256=xnEs0QTjeuGYO3tVUIy8GDo95GqTV1peEjosGckpOu0,977
|
18
22
|
pychemstation/generated/dad_method.py,sha256=xTUiSCvkXcxBUhjVm1YZKu-tHs16k23pF-0xYrQSwWA,8408
|
19
23
|
pychemstation/generated/pump_method.py,sha256=s3MckKDw2-nZUC5lHrJVvXYdneWP8-9UvblNuGryPHY,12092
|
20
24
|
pychemstation/utils/__init__.py,sha256=GZJyDzkhzrlMguxZTUpgthq72pA3YV23DJIR2Q63PCk,449
|
21
|
-
pychemstation/utils/device_types.py,sha256=
|
25
|
+
pychemstation/utils/device_types.py,sha256=sjWofM20HKEFZHLILux5CIccXYapXyGCS0zxT9zsPR0,1321
|
22
26
|
pychemstation/utils/injector_types.py,sha256=z2iWwTklGm0GRDCL9pnPCovQrwyRwxv8w5w5Xh7Pj3U,1152
|
23
|
-
pychemstation/utils/macro.py,sha256=
|
27
|
+
pychemstation/utils/macro.py,sha256=XCHQM-C_5UR48SZPSS4vp6QWSxF-nnQVN5evpNiqXl0,3505
|
24
28
|
pychemstation/utils/method_types.py,sha256=ck8I4dRGhHXCUfBf3AT1OU1eCcSSZPgnlhvlLTfezEM,1562
|
25
29
|
pychemstation/utils/num_utils.py,sha256=OpqZwMPoxTYkpjpinA1CcoQAXDY_0sie6d-hTU547uo,2087
|
26
30
|
pychemstation/utils/parsing.py,sha256=mzdpxrH5ux4-_i4CwZvnIYnIwAnRnOptKb3fZyYJcx0,9307
|
27
31
|
pychemstation/utils/sequence_types.py,sha256=H9htO2thyU9_KYOFBsGjlmA-4Nyd6aLd4D0MDLaXNCQ,2583
|
28
32
|
pychemstation/utils/spec_utils.py,sha256=BtXgQndZy4kVKsrgEDxwNd0HctypnAt5upB9SOk1D9w,9700
|
29
|
-
pychemstation/utils/table_types.py,sha256=
|
33
|
+
pychemstation/utils/table_types.py,sha256=r8hGb2Ey0_sheGqqMAC96vlEFDc6eQ72SInqdZ3trj8,5846
|
30
34
|
pychemstation/utils/tray_types.py,sha256=UeHM0hUYaNc9giT96ZiGpyWBPQwG-SyLA0rVGzDDAJk,6618
|
31
35
|
pychemstation/utils/abc_tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
36
|
pychemstation/utils/abc_tables/abc_comm.py,sha256=7ywcufQZ7UWfNQdEEsfHqkA2CpRkt6ZlKYuLt9MXjvs,5656
|
33
|
-
pychemstation/utils/abc_tables/device.py,sha256=
|
37
|
+
pychemstation/utils/abc_tables/device.py,sha256=5cAYoU5u0_7yN3lrzPe9xiSoT6qALu2lTU4iBGnqcpM,1194
|
34
38
|
pychemstation/utils/abc_tables/run.py,sha256=uURDl66Mga8NAMffOUsG6prKhjpLo1-p2Y2PUTY1hY0,10052
|
35
|
-
pychemstation/utils/abc_tables/table.py,sha256=
|
39
|
+
pychemstation/utils/abc_tables/table.py,sha256=lIumyZ2qCaF9j7A2OF-FbQfK0NhpFACP_cjSGnXg7kU,12041
|
36
40
|
pychemstation/utils/mocking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
41
|
pychemstation/utils/mocking/mock_comm.py,sha256=vZeYBXaKBZOlJmhn4TSbkov62gqlkfztqf3MSFU9kLE,800
|
38
42
|
pychemstation/utils/mocking/mock_hplc.py,sha256=esVIlU4oqEsYLPOQs0AeVnKv9l52xBGT6UY862l9RQE,1163
|
39
|
-
pychemstation-0.10.
|
40
|
-
pychemstation-0.10.
|
41
|
-
pychemstation-0.10.
|
42
|
-
pychemstation-0.10.
|
43
|
+
pychemstation-0.10.12.dist-info/METADATA,sha256=rmxsCsOBdkgMV6McmhLT1HmepJF_04cD0x47RUcfKds,5904
|
44
|
+
pychemstation-0.10.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
45
|
+
pychemstation-0.10.12.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
|
46
|
+
pychemstation-0.10.12.dist-info/RECORD,,
|
File without changes
|
File without changes
|