pychemstation 0.10.11__py3-none-any.whl → 0.10.13__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 +112 -136
- pychemstation/control/controllers/data_aq/sequence.py +67 -34
- pychemstation/control/controllers/devices/__init__.py +4 -1
- pychemstation/control/controllers/devices/column.py +61 -0
- pychemstation/control/controllers/devices/dad.py +85 -0
- pychemstation/control/controllers/devices/injector.py +18 -0
- 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 +146 -63
- pychemstation/utils/device_types.py +66 -0
- pychemstation/utils/macro.py +2 -0
- pychemstation/utils/table_types.py +65 -8
- {pychemstation-0.10.11.dist-info → pychemstation-0.10.13.dist-info}/METADATA +2 -2
- {pychemstation-0.10.11.dist-info → pychemstation-0.10.13.dist-info}/RECORD +19 -15
- {pychemstation-0.10.11.dist-info → pychemstation-0.10.13.dist-info}/WHEEL +0 -0
- {pychemstation-0.10.11.dist-info → pychemstation-0.10.13.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,26 +110,32 @@ 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
|
@@ -130,15 +146,16 @@ class ABCTableController(abc.ABC):
|
|
130
146
|
if row and num_rows < row:
|
131
147
|
raise ValueError("Not enough rows to edit!")
|
132
148
|
|
133
|
-
self.
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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
|
+
)
|
140
158
|
)
|
141
|
-
)
|
142
159
|
|
143
160
|
def _edit_row_text(
|
144
161
|
self, col_name: RegisterFlag, val: str, row: Optional[int] = None
|
@@ -149,28 +166,28 @@ class ABCTableController(abc.ABC):
|
|
149
166
|
if row and num_rows < row:
|
150
167
|
raise ValueError("Not enough rows to edit!")
|
151
168
|
|
152
|
-
self.
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
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
|
+
)
|
159
178
|
)
|
160
|
-
)
|
161
|
-
|
162
|
-
@abc.abstractmethod
|
163
|
-
def get_row(self, row: int):
|
164
|
-
pass
|
165
179
|
|
166
180
|
def delete_row(self, row: int):
|
167
|
-
self.
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
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
|
+
)
|
172
188
|
)
|
173
|
-
|
189
|
+
else:
|
190
|
+
raise ValueError("controller is offline or given device, need table")
|
174
191
|
|
175
192
|
def get_row_count_safely(self) -> int:
|
176
193
|
row_count = self.get_num_rows()
|
@@ -213,29 +230,95 @@ class ABCTableController(abc.ABC):
|
|
213
230
|
)
|
214
231
|
|
215
232
|
def get_num_rows(self) -> Result[Response, str]:
|
216
|
-
self.
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
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
|
+
)
|
221
240
|
)
|
222
|
-
)
|
223
|
-
if self.controller:
|
224
241
|
res = self.controller.receive()
|
242
|
+
if res.is_ok():
|
243
|
+
return res
|
244
|
+
else:
|
245
|
+
return Err("No rows could be read.")
|
225
246
|
else:
|
226
|
-
raise ValueError(
|
247
|
+
raise ValueError(
|
248
|
+
"controller was offline or was given a device and not a table"
|
249
|
+
)
|
227
250
|
|
228
|
-
|
229
|
-
|
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
|
+
)
|
230
261
|
else:
|
231
|
-
|
262
|
+
raise ValueError("controller is offline or given device, need table")
|
232
263
|
|
233
|
-
def
|
234
|
-
self.
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
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
|
+
)
|
240
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
|
241
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.13
|
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
|
15
|
-
pychemstation/control/controllers/devices/__init__.py,sha256=
|
16
|
-
pychemstation/control/controllers/devices/
|
13
|
+
pychemstation/control/controllers/data_aq/method.py,sha256=K9dMJG8DtsaM1q8kmyBLuilKD9RAd5FOBB91QnC3wr0,20709
|
14
|
+
pychemstation/control/controllers/data_aq/sequence.py,sha256=HCZgT7d2AUGsSy8w6dlmZZ3z2Xf4Nktrx_OdWXPxiks,19486
|
15
|
+
pychemstation/control/controllers/devices/__init__.py,sha256=uQBaaO4jUa16_Qb6SFPbqQHdSH0mvY9KPBQ0O0xD9XY,231
|
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.13.dist-info/METADATA,sha256=K2wCBpKhM6zvZU_fvmX6vcRkBQQtE7LDnrqBO-23P8E,5904
|
44
|
+
pychemstation-0.10.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
45
|
+
pychemstation-0.10.13.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
|
46
|
+
pychemstation-0.10.13.dist-info/RECORD,,
|
File without changes
|
File without changes
|