pychemstation 0.10.4__py3-none-any.whl → 0.10.6__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/analysis/__init__.py +8 -1
- pychemstation/analysis/chromatogram.py +20 -0
- pychemstation/analysis/process_report.py +125 -63
- pychemstation/control/__init__.py +2 -0
- pychemstation/control/controllers/__init__.py +2 -3
- pychemstation/control/controllers/abc_tables/device.py +15 -0
- pychemstation/control/controllers/abc_tables/run.py +228 -0
- pychemstation/control/controllers/abc_tables/table.py +221 -0
- pychemstation/control/controllers/comm.py +25 -106
- pychemstation/control/controllers/data_aq/__init__.py +4 -0
- pychemstation/control/controllers/{tables → data_aq}/method.py +52 -95
- pychemstation/control/controllers/{tables → data_aq}/sequence.py +199 -141
- pychemstation/control/controllers/devices/__init__.py +3 -0
- pychemstation/control/controllers/devices/injector.py +69 -24
- pychemstation/control/hplc.py +15 -17
- pychemstation/utils/injector_types.py +23 -3
- pychemstation/utils/macro.py +2 -2
- pychemstation/utils/method_types.py +1 -1
- pychemstation/utils/mocking/__init__.py +0 -0
- pychemstation/utils/mocking/abc_comm.py +160 -0
- pychemstation/utils/mocking/mock_comm.py +5 -0
- pychemstation/utils/mocking/mock_hplc.py +2 -0
- pychemstation/utils/sequence_types.py +19 -0
- pychemstation/utils/table_types.py +6 -0
- pychemstation/utils/tray_types.py +36 -1
- {pychemstation-0.10.4.dist-info → pychemstation-0.10.6.dist-info}/METADATA +4 -4
- pychemstation-0.10.6.dist-info/RECORD +42 -0
- pychemstation/control/controllers/devices/device.py +0 -49
- pychemstation/control/controllers/tables/ms.py +0 -24
- pychemstation/control/controllers/tables/table.py +0 -375
- pychemstation-0.10.4.dist-info/RECORD +0 -37
- /pychemstation/control/controllers/{tables → abc_tables}/__init__.py +0 -0
- {pychemstation-0.10.4.dist-info → pychemstation-0.10.6.dist-info}/WHEEL +0 -0
- {pychemstation-0.10.4.dist-info → pychemstation-0.10.6.dist-info}/licenses/LICENSE +0 -0
pychemstation/control/hplc.py
CHANGED
@@ -8,22 +8,19 @@ from __future__ import annotations
|
|
8
8
|
|
9
9
|
from typing import Dict, List, Optional, Tuple, Union
|
10
10
|
|
11
|
+
from pychemstation.analysis.chromatogram import AgilentChannelChromatogramData
|
11
12
|
from pychemstation.analysis.chromatogram import (
|
12
13
|
AgilentHPLCChromatogram,
|
13
14
|
)
|
14
|
-
|
15
|
+
from .controllers.devices.injector import InjectorController
|
16
|
+
from .controllers.data_aq.sequence import SequenceController, MethodController
|
15
17
|
from ..analysis.process_report import AgilentReport, ReportType
|
16
|
-
from ..control.controllers import
|
17
|
-
|
18
|
-
MethodController,
|
19
|
-
SequenceController,
|
20
|
-
)
|
21
|
-
from pychemstation.analysis.chromatogram import AgilentChannelChromatogramData
|
18
|
+
from ..control.controllers import CommunicationController
|
19
|
+
from ..utils.injector_types import InjectorTable
|
22
20
|
from ..utils.macro import Command, Response, Status
|
23
21
|
from ..utils.method_types import MethodDetails
|
24
22
|
from ..utils.sequence_types import SequenceTable
|
25
23
|
from ..utils.table_types import Table
|
26
|
-
from .controllers.devices.injector import InjectorController
|
27
24
|
|
28
25
|
|
29
26
|
class HPLCController:
|
@@ -56,12 +53,10 @@ class HPLCController:
|
|
56
53
|
:param sequence_dir: Name of directory where sequence files are stored.
|
57
54
|
:raises FileNotFoundError: If either `data_dir`, `method_dir`, `sequence_dir`, `sequence_data_dir`or `comm_dir` is not a valid directory.
|
58
55
|
"""
|
59
|
-
self.comm = (
|
60
|
-
|
61
|
-
if not offline
|
62
|
-
else None
|
56
|
+
self.comm: CommunicationController = CommunicationController(
|
57
|
+
comm_dir=comm_dir, debug=debug
|
63
58
|
)
|
64
|
-
self.method_controller = MethodController(
|
59
|
+
self.method_controller: MethodController = MethodController(
|
65
60
|
controller=self.comm,
|
66
61
|
src=method_dir,
|
67
62
|
data_dirs=data_dirs,
|
@@ -71,7 +66,7 @@ class HPLCController:
|
|
71
66
|
controller=self.comm, table=self.INJECTOR_TABLE, offline=offline
|
72
67
|
),
|
73
68
|
)
|
74
|
-
self.sequence_controller = SequenceController(
|
69
|
+
self.sequence_controller: SequenceController = SequenceController(
|
75
70
|
controller=self.comm,
|
76
71
|
src=sequence_dir,
|
77
72
|
data_dirs=data_dirs,
|
@@ -92,7 +87,7 @@ class HPLCController:
|
|
92
87
|
)
|
93
88
|
self.comm.send(cmd)
|
94
89
|
|
95
|
-
def receive(self) -> Response:
|
90
|
+
def receive(self) -> None | Response | str:
|
96
91
|
"""
|
97
92
|
Get the most recent response from Chemstation.
|
98
93
|
|
@@ -224,7 +219,7 @@ class HPLCController:
|
|
224
219
|
|
225
220
|
def get_last_run_method_data(
|
226
221
|
self, read_uv: bool = False, custom_path: Optional[str] = None
|
227
|
-
) -> Dict[
|
222
|
+
) -> Dict[int, AgilentHPLCChromatogram] | AgilentChannelChromatogramData:
|
228
223
|
"""
|
229
224
|
Returns the last run method data.
|
230
225
|
|
@@ -264,7 +259,7 @@ class HPLCController:
|
|
264
259
|
:param read_uv: whether to also read the UV file
|
265
260
|
"""
|
266
261
|
if read_uv:
|
267
|
-
return self.sequence_controller.
|
262
|
+
return self.sequence_controller.get_data_mult_uv(custom_path=custom_path)
|
268
263
|
else:
|
269
264
|
return self.sequence_controller.get_data(custom_path=custom_path)
|
270
265
|
|
@@ -284,6 +279,9 @@ class HPLCController:
|
|
284
279
|
"""Returns the currently loaded sequence."""
|
285
280
|
return self.sequence_controller.load()
|
286
281
|
|
282
|
+
def load_injector_program(self) -> InjectorTable:
|
283
|
+
return self.method_controller.injector_controller.load()
|
284
|
+
|
287
285
|
def standby(self):
|
288
286
|
"""Switches all modules in standby mode. All lamps and pumps are switched off."""
|
289
287
|
self.send(Command.STANDBY_CMD)
|
@@ -19,13 +19,28 @@ class Mode(Enum):
|
|
19
19
|
@dataclass
|
20
20
|
class Draw:
|
21
21
|
amount: Optional[float] = None
|
22
|
-
location: Optional[
|
22
|
+
location: Optional[Tray] = None
|
23
23
|
source: Optional[Tray] = None
|
24
24
|
|
25
25
|
|
26
|
+
@dataclass
|
27
|
+
class DrawDefaultVolume:
|
28
|
+
location: Optional[Tray] = None
|
29
|
+
|
30
|
+
|
31
|
+
@dataclass
|
32
|
+
class DrawDefaultLocation:
|
33
|
+
amount: Optional[float] = None
|
34
|
+
|
35
|
+
|
36
|
+
@dataclass
|
37
|
+
class DrawDefault:
|
38
|
+
pass
|
39
|
+
|
40
|
+
|
26
41
|
@dataclass
|
27
42
|
class Wait:
|
28
|
-
duration: int
|
43
|
+
duration: Union[int, float]
|
29
44
|
|
30
45
|
|
31
46
|
@dataclass
|
@@ -35,6 +50,9 @@ class Inject:
|
|
35
50
|
|
36
51
|
class RemoteCommand(Enum):
|
37
52
|
START = "START"
|
53
|
+
NOT_READY = "NOT_READY"
|
54
|
+
STOP = "STOP"
|
55
|
+
READY = "READY"
|
38
56
|
PREPARE = "PREPARE"
|
39
57
|
|
40
58
|
|
@@ -44,7 +62,9 @@ class Remote:
|
|
44
62
|
duration: int
|
45
63
|
|
46
64
|
|
47
|
-
InjectorFunction = Union[
|
65
|
+
InjectorFunction = Union[
|
66
|
+
Draw, DrawDefault, DrawDefaultVolume, DrawDefaultLocation, Wait, Inject, Remote
|
67
|
+
]
|
48
68
|
|
49
69
|
|
50
70
|
@dataclass
|
pychemstation/utils/macro.py
CHANGED
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
from dataclasses import dataclass
|
4
4
|
from enum import Enum
|
5
|
-
from typing import Union
|
5
|
+
from typing import Union
|
6
6
|
|
7
7
|
|
8
8
|
@dataclass
|
@@ -88,7 +88,7 @@ class HPLCErrorStatus(Enum):
|
|
88
88
|
|
89
89
|
def str_to_status(
|
90
90
|
status: str,
|
91
|
-
)
|
91
|
+
):
|
92
92
|
if HPLCErrorStatus.has_member_key(status):
|
93
93
|
return HPLCErrorStatus[status]
|
94
94
|
if HPLCRunningStatus.has_member_key(status):
|
File without changes
|
@@ -0,0 +1,160 @@
|
|
1
|
+
"""
|
2
|
+
Module to provide API for the communication with Agilent HPLC systems.
|
3
|
+
|
4
|
+
HPLCController sends commands to Chemstation software via a command file.
|
5
|
+
Answers are received via reply file. On the Chemstation side, a custom
|
6
|
+
Macro monitors the command file, executes commands and writes to the reply file.
|
7
|
+
Each command is given a number (cmd_no) to keep track of which commands have
|
8
|
+
been processed.
|
9
|
+
|
10
|
+
Authors: Alexander Hammer, Hessam Mehr, Lucy Hao
|
11
|
+
"""
|
12
|
+
|
13
|
+
import abc
|
14
|
+
import os
|
15
|
+
import time
|
16
|
+
from abc import abstractmethod
|
17
|
+
from typing import Union
|
18
|
+
|
19
|
+
from result import Err, Ok, Result
|
20
|
+
|
21
|
+
from ...utils.macro import (
|
22
|
+
HPLCAvailStatus,
|
23
|
+
Command,
|
24
|
+
Status,
|
25
|
+
Response,
|
26
|
+
)
|
27
|
+
|
28
|
+
|
29
|
+
class ABCCommunicationController(abc.ABC):
|
30
|
+
"""
|
31
|
+
Abstract class representing the communication controller.
|
32
|
+
"""
|
33
|
+
|
34
|
+
# maximum command number
|
35
|
+
MAX_CMD_NO = 255
|
36
|
+
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
comm_dir: str,
|
40
|
+
cmd_file: str = "cmd",
|
41
|
+
reply_file: str = "reply",
|
42
|
+
offline: bool = False,
|
43
|
+
debug: bool = False,
|
44
|
+
):
|
45
|
+
"""
|
46
|
+
:param comm_dir:
|
47
|
+
:param cmd_file: Name of command file
|
48
|
+
:param reply_file: Name of reply file
|
49
|
+
:param debug: whether to save log of sent commands
|
50
|
+
"""
|
51
|
+
if not offline:
|
52
|
+
self.debug = debug
|
53
|
+
if os.path.isdir(comm_dir):
|
54
|
+
self.cmd_file = os.path.join(comm_dir, cmd_file)
|
55
|
+
self.reply_file = os.path.join(comm_dir, reply_file)
|
56
|
+
self.cmd_no = 0
|
57
|
+
else:
|
58
|
+
raise FileNotFoundError(f"comm_dir: {comm_dir} not found.")
|
59
|
+
|
60
|
+
# Create files for Chemstation to communicate with Python
|
61
|
+
open(self.cmd_file, "a").close()
|
62
|
+
open(self.reply_file, "a").close()
|
63
|
+
|
64
|
+
self.reset_cmd_counter()
|
65
|
+
self._most_recent_hplc_status: Status = self.get_status()
|
66
|
+
self.send("Local Rows")
|
67
|
+
|
68
|
+
@abstractmethod
|
69
|
+
def get_num_val(self, cmd: str) -> Union[int, float]:
|
70
|
+
pass
|
71
|
+
|
72
|
+
@abstractmethod
|
73
|
+
def get_text_val(self, cmd: str) -> str:
|
74
|
+
pass
|
75
|
+
|
76
|
+
@abstractmethod
|
77
|
+
def get_status(self) -> Status:
|
78
|
+
pass
|
79
|
+
|
80
|
+
@abstractmethod
|
81
|
+
def _send(self, cmd: str, cmd_no: int, num_attempts=5) -> None:
|
82
|
+
pass
|
83
|
+
|
84
|
+
@abstractmethod
|
85
|
+
def _receive(self, cmd_no: int, num_attempts=100) -> Result[str, str]:
|
86
|
+
pass
|
87
|
+
|
88
|
+
def set_status(self):
|
89
|
+
"""Updates current status of HPLC machine"""
|
90
|
+
self._most_recent_hplc_status = self.get_status()
|
91
|
+
|
92
|
+
def check_if_not_running(self) -> bool:
|
93
|
+
"""Checks if HPLC machine is in an available state, meaning a state that data is not being written.
|
94
|
+
|
95
|
+
:return: whether the HPLC machine is in a safe state to retrieve data back."""
|
96
|
+
self.set_status()
|
97
|
+
hplc_avail = isinstance(self._most_recent_hplc_status, HPLCAvailStatus)
|
98
|
+
time.sleep(5)
|
99
|
+
self.set_status()
|
100
|
+
hplc_actually_avail = isinstance(self._most_recent_hplc_status, HPLCAvailStatus)
|
101
|
+
return hplc_avail and hplc_actually_avail
|
102
|
+
|
103
|
+
def sleepy_send(self, cmd: Union[Command, str]):
|
104
|
+
self.send("Sleep 0.1")
|
105
|
+
self.send(cmd)
|
106
|
+
self.send("Sleep 0.1")
|
107
|
+
|
108
|
+
def send(self, cmd: Union[Command, str]):
|
109
|
+
"""Sends a command to Chemstation.
|
110
|
+
|
111
|
+
:param cmd: Command to be sent to HPLC
|
112
|
+
"""
|
113
|
+
if self.cmd_no == self.MAX_CMD_NO:
|
114
|
+
self.reset_cmd_counter()
|
115
|
+
|
116
|
+
cmd_to_send: str = cmd.value if isinstance(cmd, Command) else cmd
|
117
|
+
self.cmd_no += 1
|
118
|
+
self._send(cmd_to_send, self.cmd_no)
|
119
|
+
if self.debug:
|
120
|
+
f = open("out.txt", "a")
|
121
|
+
f.write(cmd_to_send + "\n")
|
122
|
+
f.close()
|
123
|
+
|
124
|
+
def receive(self) -> Result[Response, str]:
|
125
|
+
"""Returns messages received in reply file.
|
126
|
+
|
127
|
+
:return: ChemStation response
|
128
|
+
"""
|
129
|
+
num_response_prefix = "Numerical Responses:"
|
130
|
+
str_response_prefix = "String Responses:"
|
131
|
+
possible_response = self._receive(self.cmd_no)
|
132
|
+
if possible_response.is_ok():
|
133
|
+
lines = possible_response.ok_value.splitlines()
|
134
|
+
for line in lines:
|
135
|
+
if str_response_prefix in line and num_response_prefix in line:
|
136
|
+
string_responses_dirty, _, numerical_responses = line.partition(
|
137
|
+
num_response_prefix
|
138
|
+
)
|
139
|
+
_, _, string_responses = string_responses_dirty.partition(
|
140
|
+
str_response_prefix
|
141
|
+
)
|
142
|
+
return Ok(
|
143
|
+
Response(
|
144
|
+
string_response=string_responses.strip(),
|
145
|
+
num_response=float(numerical_responses.strip()),
|
146
|
+
)
|
147
|
+
)
|
148
|
+
return Err("Could not retrieve HPLC response")
|
149
|
+
else:
|
150
|
+
return Err(f"Could not establish response to HPLC: {possible_response}")
|
151
|
+
|
152
|
+
def reset_cmd_counter(self):
|
153
|
+
"""Resets the command counter."""
|
154
|
+
self._send(Command.RESET_COUNTER_CMD.value, cmd_no=self.MAX_CMD_NO + 1)
|
155
|
+
self._receive(cmd_no=self.MAX_CMD_NO + 1)
|
156
|
+
self.cmd_no = 0
|
157
|
+
|
158
|
+
def stop_macro(self):
|
159
|
+
"""Stops Macro execution. Connection will be lost."""
|
160
|
+
self.send(Command.STOP_MACRO_CMD)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
import os.path
|
3
4
|
from enum import Enum
|
4
5
|
from typing import Optional, List
|
5
6
|
from dataclasses import dataclass, field
|
@@ -51,3 +52,21 @@ class SequenceEntry:
|
|
51
52
|
class SequenceTable:
|
52
53
|
name: str
|
53
54
|
rows: list[SequenceEntry]
|
55
|
+
|
56
|
+
def __eq__(self, other):
|
57
|
+
equal = False
|
58
|
+
if not isinstance(other, SequenceTable):
|
59
|
+
return False
|
60
|
+
|
61
|
+
for self_row, other_row in zip(self.rows, other.rows):
|
62
|
+
equal |= self_row.vial_location == other_row.vial_location
|
63
|
+
equal |= self_row.data_file == other_row.data_file
|
64
|
+
equal |= (
|
65
|
+
os.path.split(os.path.normpath(self_row.method))[-1]
|
66
|
+
== os.path.split(os.path.normpath(other_row.method))[-1]
|
67
|
+
)
|
68
|
+
equal |= self_row.num_inj == other_row.num_inj
|
69
|
+
equal |= self_row.inj_vol == other_row.inj_vol
|
70
|
+
equal |= self_row.inj_source == other_row.inj_source
|
71
|
+
equal |= self_row.sample_name == other_row.sample_name
|
72
|
+
equal |= self_row.sample_type == other_row.sample_type
|
@@ -43,6 +43,12 @@ class RegisterFlag(Enum):
|
|
43
43
|
FLOW = "Flow"
|
44
44
|
MAX_TIME = "StopTime_Time"
|
45
45
|
POST_TIME = "PostTime_Time" # TODO: check
|
46
|
+
SIGNAL_A = "Signal_Wavelength"
|
47
|
+
SIGNAL_B = "Signal2_Wavelength"
|
48
|
+
SIGNAL_C = "Signal3_Wavelength"
|
49
|
+
SIGNAL_D = "Signal4_Wavelength"
|
50
|
+
SIGNAL_E = "Signal5_Wavelength"
|
51
|
+
SIGNAL_A_USED = "Signal1_IsUsed"
|
46
52
|
COLUMN_OVEN_TEMP1 = "TemperatureControl_Temperature"
|
47
53
|
COLUMN_OVEN_TEMP2 = "TemperatureControl2_Temperature"
|
48
54
|
STOPTIME_MODE = "StopTime_Mode"
|
@@ -71,6 +71,22 @@ class Letter(Enum):
|
|
71
71
|
else:
|
72
72
|
raise ValueError("Letter must be one of A to F")
|
73
73
|
|
74
|
+
@classmethod
|
75
|
+
def from_int(cls, num: int) -> Letter:
|
76
|
+
letter_mapping = {
|
77
|
+
"A": Letter.A,
|
78
|
+
"B": Letter.B,
|
79
|
+
"C": Letter.C,
|
80
|
+
"D": Letter.D,
|
81
|
+
"E": Letter.E,
|
82
|
+
"F": Letter.F,
|
83
|
+
}
|
84
|
+
|
85
|
+
if num <= len(letter_mapping):
|
86
|
+
return list(letter_mapping.values())[num]
|
87
|
+
else:
|
88
|
+
raise ValueError("Letter must be one of A to F")
|
89
|
+
|
74
90
|
|
75
91
|
@dataclass
|
76
92
|
class FiftyFourVialPlate:
|
@@ -91,6 +107,17 @@ class FiftyFourVialPlate:
|
|
91
107
|
def value(self) -> int:
|
92
108
|
return self.plate.value + self.letter.value + self.num.value
|
93
109
|
|
110
|
+
@classmethod
|
111
|
+
def from_tray_row_col(cls, tray: int, row: int, col: int):
|
112
|
+
try:
|
113
|
+
return FiftyFourVialPlate(
|
114
|
+
plate=Plate.from_num(tray),
|
115
|
+
letter=Letter.from_int(row),
|
116
|
+
num=Num.from_num(col),
|
117
|
+
)
|
118
|
+
except Exception:
|
119
|
+
raise ValueError("Could not parse tray location.")
|
120
|
+
|
94
121
|
@classmethod
|
95
122
|
def from_str(cls, loc: str):
|
96
123
|
"""
|
@@ -190,4 +217,12 @@ class TenVialColumn(Enum):
|
|
190
217
|
TEN = 10
|
191
218
|
|
192
219
|
|
193
|
-
|
220
|
+
@dataclass
|
221
|
+
class LocationPlus:
|
222
|
+
unit: int
|
223
|
+
tray: int
|
224
|
+
row: int
|
225
|
+
col: int
|
226
|
+
|
227
|
+
|
228
|
+
Tray = Union[FiftyFourVialPlate, TenVialColumn, LocationPlus]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pychemstation
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.6
|
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
|
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.11
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
14
14
|
Requires-Python: >=3.10
|
15
|
-
Requires-Dist: aghplctools
|
15
|
+
Requires-Dist: aghplctools==4.8.6
|
16
16
|
Requires-Dist: coverage>=7.6.1
|
17
17
|
Requires-Dist: matplotlib>=3.7.5
|
18
18
|
Requires-Dist: pandas>=2.0.3
|
@@ -35,8 +35,8 @@ Description-Content-Type: text/markdown
|
|
35
35
|
|
36
36
|
[](https://pypi.org/project/pychemstation/)
|
37
37
|
|
38
|
-
> **_NOTE:_** If you are running Python **3.8**, use versions 0.**8**.x. If you are running Python
|
39
|
-
> version 0.**10**.x. You are welcome to use newer pychemstation versions with older Python versions, but functionality
|
38
|
+
> **_NOTE:_** If you are running Python **3.8**, use versions 0.**8**.x. If you are running Python **3.9** use versions 0.**9**.x.
|
39
|
+
> If you are running Python **>=3.10**, use version 0.**10**.x. You are welcome to use newer pychemstation versions with older Python versions, but functionality
|
40
40
|
> is not guaranteed!
|
41
41
|
|
42
42
|
Unofficial Python package to control Agilent Chemstation; we are not affiliated with Agilent.
|
@@ -0,0 +1,42 @@
|
|
1
|
+
pychemstation/__init__.py,sha256=Sc4z8LRVFMwJUoc_DPVUriSXTZ6PO9MaJ80PhRbKyB8,34
|
2
|
+
pychemstation/analysis/__init__.py,sha256=mPNnp0TmkoUxrTGcT6wNKMyCiOar5vC0cTPmFLrDU1Q,313
|
3
|
+
pychemstation/analysis/base_spectrum.py,sha256=t_VoxAtBph1V7S4fOsziERHiOBkYP0_nH7LTwbTEvcE,16529
|
4
|
+
pychemstation/analysis/chromatogram.py,sha256=cHxPd5-miA6L3FjwN5cSFyq4xEeZoHWFFk8gU6tCgg4,3946
|
5
|
+
pychemstation/analysis/process_report.py,sha256=xckcpqnYfzFTIo1nhgwP5A4GPJsW3PQ_qzuy5Z1KOuI,14714
|
6
|
+
pychemstation/control/README.md,sha256=_7ITj4hD17YIwci6UY6xBebC9gPCBpzBFTB_Gx0eJBc,3124
|
7
|
+
pychemstation/control/__init__.py,sha256=7lSkY7Qa7Ikdz82-2FESc_oqktv7JndsjltCkiMqnMI,147
|
8
|
+
pychemstation/control/hplc.py,sha256=C4cnjsSsjgK_VcySGhbG1OMGEVoY3pYSA69dnvqwEL0,12526
|
9
|
+
pychemstation/control/controllers/README.md,sha256=S5cd4NJmPjs6TUH98BtPJJhiS1Lu-mxLCNS786ogOrQ,32
|
10
|
+
pychemstation/control/controllers/__init__.py,sha256=EWvvITwY6RID5b1ilVsPowP85uzmIt3LYW0rvyN-3x0,146
|
11
|
+
pychemstation/control/controllers/comm.py,sha256=saTyM86kUZ7mevWPpna7LoMC-Q0KR4Pq0cURhCoiW8k,5018
|
12
|
+
pychemstation/control/controllers/abc_tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
+
pychemstation/control/controllers/abc_tables/device.py,sha256=HRea-dRwHf7u1aA1m2C9TmIBhhKKifmqVdPfZxmwoyk,442
|
14
|
+
pychemstation/control/controllers/abc_tables/run.py,sha256=8RGvQ3NrXPidoGOilxyFoGHxaM1r1qn2d3TLLyOe4po,8202
|
15
|
+
pychemstation/control/controllers/abc_tables/table.py,sha256=XriB53rn1YOAMCS4AGARKoniaXOQi5qUsBSNuLCn8ew,7196
|
16
|
+
pychemstation/control/controllers/data_aq/__init__.py,sha256=w-Zgbit10niOQfz780ZmRHjUFxV1hMkdui7fOMPqeLA,132
|
17
|
+
pychemstation/control/controllers/data_aq/method.py,sha256=HnVMg-qwKSY7mTmw0AerMlVWHeu72YPfPBviTnzavA4,18214
|
18
|
+
pychemstation/control/controllers/data_aq/sequence.py,sha256=Q77YkDTkIxUbsRYyN5OJt1a0HgD9TxHW-LiFRQDV8Kk,16516
|
19
|
+
pychemstation/control/controllers/devices/__init__.py,sha256=QpgGnLXyWiB96KIB98wMccEi8oOUUaLxvBCyevJzcOg,75
|
20
|
+
pychemstation/control/controllers/devices/injector.py,sha256=NXJEKDGu-XJoQDbaJav6tD73S7UqFZqXJd5bcwdvwBQ,4047
|
21
|
+
pychemstation/generated/__init__.py,sha256=xnEs0QTjeuGYO3tVUIy8GDo95GqTV1peEjosGckpOu0,977
|
22
|
+
pychemstation/generated/dad_method.py,sha256=xTUiSCvkXcxBUhjVm1YZKu-tHs16k23pF-0xYrQSwWA,8408
|
23
|
+
pychemstation/generated/pump_method.py,sha256=s3MckKDw2-nZUC5lHrJVvXYdneWP8-9UvblNuGryPHY,12092
|
24
|
+
pychemstation/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
+
pychemstation/utils/injector_types.py,sha256=z2iWwTklGm0GRDCL9pnPCovQrwyRwxv8w5w5Xh7Pj3U,1152
|
26
|
+
pychemstation/utils/macro.py,sha256=Y_0CwTHcDQKoxYrNHqdF14-ciwtx56Y65SzNtOFPhNk,2848
|
27
|
+
pychemstation/utils/method_types.py,sha256=_2djFz_uWFc9aoZcyPMIjC5KYBs003WPoQGx7ZhMiOg,1649
|
28
|
+
pychemstation/utils/num_utils.py,sha256=dDs8sLZ_SdtvDKhyhF3IkljiVf16IYqpMTO5tEk9vMk,2079
|
29
|
+
pychemstation/utils/parsing.py,sha256=mzdpxrH5ux4-_i4CwZvnIYnIwAnRnOptKb3fZyYJcx0,9307
|
30
|
+
pychemstation/utils/pump_types.py,sha256=HWQHxscGn19NTrfYBwQRCO2VcYfwyko7YfBO5uDhEm4,93
|
31
|
+
pychemstation/utils/sequence_types.py,sha256=XVAi1MCQrNqwbmzrBrVbapjD_AQg6A-l0nwjNsNAbKs,1924
|
32
|
+
pychemstation/utils/spec_utils.py,sha256=lS27Xi4mFNDWBfmBqOoxTcVchPAkLK2mSdoaWDOfaPI,10211
|
33
|
+
pychemstation/utils/table_types.py,sha256=I5xy7tpmMWOMb6tFfWVE1r4wnSsgky5sZU9oNtHU9BE,3451
|
34
|
+
pychemstation/utils/tray_types.py,sha256=FUjCUnozt5ZjCl5Vg9FioPHGTdKa43SQI1QPVkoBmV0,6078
|
35
|
+
pychemstation/utils/mocking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
+
pychemstation/utils/mocking/abc_comm.py,sha256=zt1_6IBme6FiRjZ3zvUvlSdToBb85u3th8NKKGprn_Q,5246
|
37
|
+
pychemstation/utils/mocking/mock_comm.py,sha256=nYSK2S85iDACIY73rX56yyqyaWo6Oaj3H7gvMsrkRJA,150
|
38
|
+
pychemstation/utils/mocking/mock_hplc.py,sha256=Hx6127C7d3miYGCZYxbN-Q3PU8kpMgXYX2n6we2Twgw,25
|
39
|
+
pychemstation-0.10.6.dist-info/METADATA,sha256=yfxKdWhVOQkClZFBqiluL41D6PH3XkVZ9SoXxKQlY8Q,5933
|
40
|
+
pychemstation-0.10.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
41
|
+
pychemstation-0.10.6.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
|
42
|
+
pychemstation-0.10.6.dist-info/RECORD,,
|
@@ -1,49 +0,0 @@
|
|
1
|
-
import abc
|
2
|
-
from typing import List, Union, Dict, Optional
|
3
|
-
|
4
|
-
from result import Result
|
5
|
-
|
6
|
-
from ....analysis.process_report import AgilentReport, ReportType
|
7
|
-
from ....control.controllers import CommunicationController
|
8
|
-
from ....control.controllers.tables.table import TableController
|
9
|
-
from pychemstation.analysis.chromatogram import (
|
10
|
-
AgilentChannelChromatogramData,
|
11
|
-
AgilentHPLCChromatogram,
|
12
|
-
)
|
13
|
-
from ....utils.table_types import T, Table
|
14
|
-
|
15
|
-
|
16
|
-
class DeviceController(TableController, abc.ABC):
|
17
|
-
def __init__(
|
18
|
-
self, controller: CommunicationController, table: Table, offline: bool
|
19
|
-
):
|
20
|
-
super().__init__(
|
21
|
-
controller=controller, src=None, data_dirs=[], table=table, offline=offline
|
22
|
-
)
|
23
|
-
|
24
|
-
@abc.abstractmethod
|
25
|
-
def get_row(self, row: int):
|
26
|
-
pass
|
27
|
-
|
28
|
-
def retrieve_recent_data_files(self):
|
29
|
-
raise NotImplementedError
|
30
|
-
|
31
|
-
def fuzzy_match_most_recent_folder(self, most_recent_folder: T) -> Result[T, str]:
|
32
|
-
raise NotImplementedError
|
33
|
-
|
34
|
-
def get_report(
|
35
|
-
self, report_type: ReportType = ReportType.TXT
|
36
|
-
) -> List[AgilentReport]:
|
37
|
-
raise NotImplementedError
|
38
|
-
|
39
|
-
def get_data_uv(
|
40
|
-
self,
|
41
|
-
) -> Union[
|
42
|
-
List[Dict[str, AgilentHPLCChromatogram]], Dict[str, AgilentHPLCChromatogram]
|
43
|
-
]:
|
44
|
-
raise NotImplementedError
|
45
|
-
|
46
|
-
def get_data(
|
47
|
-
self, custom_path: Optional[str] = None
|
48
|
-
) -> Union[List[AgilentChannelChromatogramData], AgilentChannelChromatogramData]:
|
49
|
-
raise NotImplementedError
|
@@ -1,24 +0,0 @@
|
|
1
|
-
from typing import Union
|
2
|
-
|
3
|
-
from ....control.controllers import CommunicationController
|
4
|
-
from ....control.controllers.tables.table import TableController
|
5
|
-
from pychemstation.analysis.chromatogram import AgilentChannelChromatogramData
|
6
|
-
from ....utils.table_types import Table
|
7
|
-
|
8
|
-
|
9
|
-
class MassSpecController(TableController):
|
10
|
-
def __init__(
|
11
|
-
self, controller: CommunicationController, src: str, data_dir: str, table: Table
|
12
|
-
):
|
13
|
-
super().__init__(controller, src, data_dir, table)
|
14
|
-
|
15
|
-
def get_row(self, row: int):
|
16
|
-
pass
|
17
|
-
|
18
|
-
def retrieve_recent_data_files(self):
|
19
|
-
pass
|
20
|
-
|
21
|
-
def get_data(
|
22
|
-
self,
|
23
|
-
) -> Union[list[AgilentChannelChromatogramData], AgilentChannelChromatogramData]:
|
24
|
-
pass
|