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.
Files changed (34) hide show
  1. pychemstation/analysis/__init__.py +8 -1
  2. pychemstation/analysis/chromatogram.py +20 -0
  3. pychemstation/analysis/process_report.py +125 -63
  4. pychemstation/control/__init__.py +2 -0
  5. pychemstation/control/controllers/__init__.py +2 -3
  6. pychemstation/control/controllers/abc_tables/device.py +15 -0
  7. pychemstation/control/controllers/abc_tables/run.py +228 -0
  8. pychemstation/control/controllers/abc_tables/table.py +221 -0
  9. pychemstation/control/controllers/comm.py +25 -106
  10. pychemstation/control/controllers/data_aq/__init__.py +4 -0
  11. pychemstation/control/controllers/{tables → data_aq}/method.py +52 -95
  12. pychemstation/control/controllers/{tables → data_aq}/sequence.py +199 -141
  13. pychemstation/control/controllers/devices/__init__.py +3 -0
  14. pychemstation/control/controllers/devices/injector.py +69 -24
  15. pychemstation/control/hplc.py +15 -17
  16. pychemstation/utils/injector_types.py +23 -3
  17. pychemstation/utils/macro.py +2 -2
  18. pychemstation/utils/method_types.py +1 -1
  19. pychemstation/utils/mocking/__init__.py +0 -0
  20. pychemstation/utils/mocking/abc_comm.py +160 -0
  21. pychemstation/utils/mocking/mock_comm.py +5 -0
  22. pychemstation/utils/mocking/mock_hplc.py +2 -0
  23. pychemstation/utils/sequence_types.py +19 -0
  24. pychemstation/utils/table_types.py +6 -0
  25. pychemstation/utils/tray_types.py +36 -1
  26. {pychemstation-0.10.4.dist-info → pychemstation-0.10.6.dist-info}/METADATA +4 -4
  27. pychemstation-0.10.6.dist-info/RECORD +42 -0
  28. pychemstation/control/controllers/devices/device.py +0 -49
  29. pychemstation/control/controllers/tables/ms.py +0 -24
  30. pychemstation/control/controllers/tables/table.py +0 -375
  31. pychemstation-0.10.4.dist-info/RECORD +0 -37
  32. /pychemstation/control/controllers/{tables → abc_tables}/__init__.py +0 -0
  33. {pychemstation-0.10.4.dist-info → pychemstation-0.10.6.dist-info}/WHEEL +0 -0
  34. {pychemstation-0.10.4.dist-info → pychemstation-0.10.6.dist-info}/licenses/LICENSE +0 -0
@@ -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
- CommunicationController,
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
- CommunicationController(comm_dir=comm_dir, debug=debug)
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[str, AgilentHPLCChromatogram] | AgilentChannelChromatogramData:
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.get_data_uv(custom_path=custom_path)
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[str] = None
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[Draw, Wait, Inject, Remote]
65
+ InjectorFunction = Union[
66
+ Draw, DrawDefault, DrawDefaultVolume, DrawDefaultLocation, Wait, Inject, Remote
67
+ ]
48
68
 
49
69
 
50
70
  @dataclass
@@ -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, Any, Type
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
- ) -> Type[HPLCRunningStatus[Any] | HPLCErrorStatus[Any] | HPLCAvailStatus[Any]]:
91
+ ):
92
92
  if HPLCErrorStatus.has_member_key(status):
93
93
  return HPLCErrorStatus[status]
94
94
  if HPLCRunningStatus.has_member_key(status):
@@ -31,7 +31,7 @@ class HPLCMethodParams:
31
31
  @dataclass
32
32
  class TimeTableEntry:
33
33
  start_time: float
34
- organic_modifer: float
34
+ organic_modifer: Optional[float]
35
35
  flow: Optional[float] = None
36
36
 
37
37
 
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)
@@ -0,0 +1,5 @@
1
+ from pychemstation.utils.mocking.abc_comm import ABCCommunicationController
2
+
3
+
4
+ class MockCommunicationController(ABCCommunicationController):
5
+ pass
@@ -0,0 +1,2 @@
1
+ class MockHPLC:
2
+ pass
@@ -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
- Tray = Union[FiftyFourVialPlate, TenVialColumn]
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.4
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>=4.8.8
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
  [![PyPI Latest Release](https://img.shields.io/pypi/v/pychemstation.svg)](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 **>=3.10**, use
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