pychemstation 0.10.4__py3-none-any.whl → 0.10.5__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.
@@ -31,7 +31,7 @@ from pychemstation.analysis.chromatogram import (
31
31
  from ....utils.macro import Command, HPLCRunningStatus, Response
32
32
  from ....utils.method_types import MethodDetails
33
33
  from ....utils.sequence_types import SequenceTable
34
- from ....utils.table_types import RegisterFlag, T, Table, TableOperation
34
+ from ....utils.table_types import RegisterFlag, Table, TableOperation, T
35
35
 
36
36
  TableType = Union[MethodDetails, SequenceTable]
37
37
 
@@ -39,9 +39,9 @@ TableType = Union[MethodDetails, SequenceTable]
39
39
  class TableController(abc.ABC):
40
40
  def __init__(
41
41
  self,
42
- controller: CommunicationController,
43
- src: Optional[str],
44
- data_dirs: Optional[List[str]],
42
+ controller: Optional[CommunicationController],
43
+ src: str,
44
+ data_dirs: List[str],
45
45
  table: Table,
46
46
  offline: bool = False,
47
47
  ):
@@ -63,7 +63,7 @@ class TableController(abc.ABC):
63
63
  self.src: str = src
64
64
  self.data_dirs: List[str] = data_dirs
65
65
 
66
- self.spectra: dict[str, Optional[AgilentHPLCChromatogram]] = {
66
+ self.spectra: dict[str, AgilentHPLCChromatogram] = {
67
67
  "A": AgilentHPLCChromatogram(),
68
68
  "B": AgilentHPLCChromatogram(),
69
69
  "C": AgilentHPLCChromatogram(),
@@ -73,17 +73,19 @@ class TableController(abc.ABC):
73
73
  "G": AgilentHPLCChromatogram(),
74
74
  "H": AgilentHPLCChromatogram(),
75
75
  }
76
- self.report: Optional[AgilentReport] = None
77
76
  self.uv: Dict[int, AgilentHPLCChromatogram] = {}
78
77
  self.data_files: List = []
79
78
 
80
79
  def receive(self) -> Result[Response, str]:
81
- for _ in range(10):
82
- try:
83
- return self.controller.receive()
84
- except IndexError:
85
- continue
86
- return Err("Could not parse response")
80
+ if self.controller:
81
+ for _ in range(10):
82
+ try:
83
+ return self.controller.receive()
84
+ except IndexError:
85
+ continue
86
+ return Err("Could not parse response")
87
+ else:
88
+ raise ValueError("Controller is offline!")
87
89
 
88
90
  def send(self, cmd: Union[Command, str]):
89
91
  if not self.controller:
@@ -93,7 +95,10 @@ class TableController(abc.ABC):
93
95
  self.controller.send(cmd)
94
96
 
95
97
  def sleepy_send(self, cmd: Union[Command, str]):
96
- self.controller.sleepy_send(cmd)
98
+ if self.controller:
99
+ self.controller.sleepy_send(cmd)
100
+ else:
101
+ raise ValueError("Controller is offline")
97
102
 
98
103
  def sleep(self, seconds: int):
99
104
  """
@@ -104,24 +109,30 @@ class TableController(abc.ABC):
104
109
  self.send(Command.SLEEP_CMD.value.format(seconds=seconds))
105
110
 
106
111
  def get_num(self, row: int, col_name: RegisterFlag) -> Union[int, float]:
107
- return self.controller.get_num_val(
108
- TableOperation.GET_ROW_VAL.value.format(
109
- register=self.table_locator.register,
110
- table_name=self.table_locator.name,
111
- row=row,
112
- col_name=col_name.value,
112
+ if self.controller:
113
+ return self.controller.get_num_val(
114
+ TableOperation.GET_ROW_VAL.value.format(
115
+ register=self.table_locator.register,
116
+ table_name=self.table_locator.name,
117
+ row=row,
118
+ col_name=col_name.value,
119
+ )
113
120
  )
114
- )
121
+ else:
122
+ raise ValueError("Controller is offline")
115
123
 
116
124
  def get_text(self, row: int, col_name: RegisterFlag) -> str:
117
- return self.controller.get_text_val(
118
- TableOperation.GET_ROW_TEXT.value.format(
119
- register=self.table_locator.register,
120
- table_name=self.table_locator.name,
121
- row=row,
122
- col_name=col_name.value,
125
+ if self.controller:
126
+ return self.controller.get_text_val(
127
+ TableOperation.GET_ROW_TEXT.value.format(
128
+ register=self.table_locator.register,
129
+ table_name=self.table_locator.name,
130
+ row=row,
131
+ col_name=col_name.value,
132
+ )
123
133
  )
124
- )
134
+ else:
135
+ raise ValueError("Controller is offline")
125
136
 
126
137
  def add_new_col_num(self, col_name: RegisterFlag, val: Union[int, float]):
127
138
  self.sleepy_send(
@@ -227,7 +238,10 @@ class TableController(abc.ABC):
227
238
  col_name=RegisterFlag.NUM_ROWS,
228
239
  )
229
240
  )
230
- res = self.controller.receive()
241
+ if self.controller:
242
+ res = self.controller.receive()
243
+ else:
244
+ raise ValueError("Controller is offline")
231
245
 
232
246
  if res.is_ok():
233
247
  self.send("Sleep 0.1")
@@ -237,33 +251,38 @@ class TableController(abc.ABC):
237
251
  return Err("No rows could be read.")
238
252
 
239
253
  def check_hplc_is_running(self) -> bool:
240
- try:
241
- started_running = polling.poll(
242
- lambda: isinstance(self.controller.get_status(), HPLCRunningStatus),
243
- step=1,
244
- max_tries=20,
245
- )
246
- except Exception as e:
247
- print(e)
248
- return False
249
- if started_running:
250
- self.curr_run_starting_time = time.time()
251
- return started_running
254
+ if self.controller:
255
+ try:
256
+ started_running = polling.poll(
257
+ lambda: isinstance(self.controller.get_status(), HPLCRunningStatus),
258
+ step=1,
259
+ max_tries=20,
260
+ )
261
+ except Exception as e:
262
+ print(e)
263
+ return False
264
+ if started_running:
265
+ self.curr_run_starting_time = time.time()
266
+ return started_running
267
+ else:
268
+ raise ValueError("Controller is offline")
252
269
 
253
270
  def check_hplc_run_finished(self) -> Tuple[float, bool]:
254
- done_running = self.controller.check_if_not_running()
255
- if self.curr_run_starting_time and self.timeout:
256
- time_passed = time.time() - self.curr_run_starting_time
257
- if time_passed > self.timeout:
258
- enough_time_passed = time_passed >= self.timeout
259
- run_finished = enough_time_passed and done_running
260
- if run_finished:
261
- self._reset_time()
262
- return 0, run_finished
263
- else:
264
- time_left = self.timeout - time_passed
265
- return time_left, self.controller.check_if_not_running()
266
- return 0, self.controller.check_if_not_running()
271
+ if self.controller:
272
+ done_running = self.controller.check_if_not_running()
273
+ if self.curr_run_starting_time and self.timeout:
274
+ time_passed = time.time() - self.curr_run_starting_time
275
+ if time_passed > self.timeout:
276
+ enough_time_passed = time_passed >= self.timeout
277
+ run_finished = enough_time_passed and done_running
278
+ if run_finished:
279
+ self._reset_time()
280
+ return 0, run_finished
281
+ else:
282
+ time_left = self.timeout - time_passed
283
+ return time_left, self.controller.check_if_not_running()
284
+ return 0, self.controller.check_if_not_running()
285
+ raise ValueError("Controller is offline!")
267
286
 
268
287
  def check_hplc_done_running(self) -> Ok[T] | Err[str]:
269
288
  """
@@ -271,31 +290,34 @@ class TableController(abc.ABC):
271
290
 
272
291
  :return: Data file object containing most recent run file information.
273
292
  """
274
- finished_run = False
275
- minutes = math.ceil(self.timeout / 60)
276
- try:
277
- finished_run = not polling.poll(
278
- lambda: self.check_hplc_run_finished()[1],
279
- max_tries=minutes - 1,
280
- step=50,
281
- )
282
- except (
283
- polling.TimeoutException,
284
- polling.PollingException,
285
- polling.MaxCallException,
286
- ):
293
+ if self.timeout is not None:
294
+ finished_run = False
295
+ minutes = math.ceil(self.timeout / 60)
287
296
  try:
288
- finished_run = polling.poll(
297
+ finished_run = not polling.poll(
289
298
  lambda: self.check_hplc_run_finished()[1],
290
- timeout=self.timeout / 2,
291
- step=1,
299
+ max_tries=minutes - 1,
300
+ step=50,
292
301
  )
293
302
  except (
294
303
  polling.TimeoutException,
295
304
  polling.PollingException,
296
305
  polling.MaxCallException,
297
306
  ):
298
- pass
307
+ try:
308
+ finished_run = polling.poll(
309
+ lambda: self.check_hplc_run_finished()[1],
310
+ timeout=self.timeout / 2,
311
+ step=1,
312
+ )
313
+ except (
314
+ polling.TimeoutException,
315
+ polling.PollingException,
316
+ polling.MaxCallException,
317
+ ):
318
+ pass
319
+ else:
320
+ raise ValueError("Timeout value is None, no comparison can be made.")
299
321
 
300
322
  check_folder = self.fuzzy_match_most_recent_folder(self.data_files[-1])
301
323
  if check_folder.is_ok() and finished_run:
@@ -324,15 +346,13 @@ class TableController(abc.ABC):
324
346
 
325
347
  @abc.abstractmethod
326
348
  def get_data_uv(
327
- self,
328
- ) -> Union[
329
- List[Dict[str, AgilentHPLCChromatogram]], Dict[str, AgilentHPLCChromatogram]
330
- ]:
349
+ self, custom_path: str | None = None
350
+ ) -> Dict[int, AgilentHPLCChromatogram]:
331
351
  pass
332
352
 
333
353
  @abc.abstractmethod
334
354
  def get_report(
335
- self, report_type: ReportType = ReportType.TXT
355
+ self, custom_path: str, report_type: ReportType = ReportType.TXT
336
356
  ) -> List[AgilentReport]:
337
357
  pass
338
358
 
@@ -351,12 +371,16 @@ class TableController(abc.ABC):
351
371
  if report_type is ReportType.TXT:
352
372
  txt_report = TXTProcessor(path).process_report()
353
373
  if txt_report.is_ok():
354
- self.report = txt_report.ok_value
374
+ return txt_report.ok_value
375
+ elif txt_report.is_err():
376
+ raise ValueError(txt_report.err_value)
355
377
  if report_type is ReportType.CSV:
356
378
  csv_report = CSVProcessor(path).process_report()
357
379
  if csv_report.is_ok():
358
- self.report = csv_report.ok_value
359
- return self.report
380
+ return csv_report.ok_value
381
+ elif csv_report.is_err():
382
+ raise ValueError(csv_report.err_value)
383
+ raise ValueError("Expected one of ReportType.TXT or ReportType.CSV")
360
384
 
361
385
  def get_spectrum_at_channels(self, data_path: str):
362
386
  """
@@ -8,22 +8,18 @@ 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.tables.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
22
19
  from ..utils.macro import Command, Response, Status
23
20
  from ..utils.method_types import MethodDetails
24
21
  from ..utils.sequence_types import SequenceTable
25
22
  from ..utils.table_types import Table
26
- from .controllers.devices.injector import InjectorController
27
23
 
28
24
 
29
25
  class HPLCController:
@@ -56,12 +52,10 @@ class HPLCController:
56
52
  :param sequence_dir: Name of directory where sequence files are stored.
57
53
  :raises FileNotFoundError: If either `data_dir`, `method_dir`, `sequence_dir`, `sequence_data_dir`or `comm_dir` is not a valid directory.
58
54
  """
59
- self.comm = (
60
- CommunicationController(comm_dir=comm_dir, debug=debug)
61
- if not offline
62
- else None
55
+ self.comm: CommunicationController = CommunicationController(
56
+ comm_dir=comm_dir, debug=debug
63
57
  )
64
- self.method_controller = MethodController(
58
+ self.method_controller: MethodController = MethodController(
65
59
  controller=self.comm,
66
60
  src=method_dir,
67
61
  data_dirs=data_dirs,
@@ -71,7 +65,7 @@ class HPLCController:
71
65
  controller=self.comm, table=self.INJECTOR_TABLE, offline=offline
72
66
  ),
73
67
  )
74
- self.sequence_controller = SequenceController(
68
+ self.sequence_controller: SequenceController = SequenceController(
75
69
  controller=self.comm,
76
70
  src=sequence_dir,
77
71
  data_dirs=data_dirs,
@@ -92,7 +86,7 @@ class HPLCController:
92
86
  )
93
87
  self.comm.send(cmd)
94
88
 
95
- def receive(self) -> Response:
89
+ def receive(self) -> None | Response | str:
96
90
  """
97
91
  Get the most recent response from Chemstation.
98
92
 
@@ -224,7 +218,7 @@ class HPLCController:
224
218
 
225
219
  def get_last_run_method_data(
226
220
  self, read_uv: bool = False, custom_path: Optional[str] = None
227
- ) -> Dict[str, AgilentHPLCChromatogram] | AgilentChannelChromatogramData:
221
+ ) -> Dict[int, AgilentHPLCChromatogram] | AgilentChannelChromatogramData:
228
222
  """
229
223
  Returns the last run method data.
230
224
 
@@ -264,7 +258,7 @@ class HPLCController:
264
258
  :param read_uv: whether to also read the UV file
265
259
  """
266
260
  if read_uv:
267
- return self.sequence_controller.get_data_uv(custom_path=custom_path)
261
+ return self.sequence_controller.get_data_mult_uv(custom_path=custom_path)
268
262
  else:
269
263
  return self.sequence_controller.get_data(custom_path=custom_path)
270
264
 
@@ -25,7 +25,7 @@ class Draw:
25
25
 
26
26
  @dataclass
27
27
  class Wait:
28
- duration: int
28
+ duration: Union[int, float]
29
29
 
30
30
 
31
31
  @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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pychemstation
3
- Version: 0.10.4
3
+ Version: 0.10.5
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,36 @@
1
+ pychemstation/__init__.py,sha256=Sc4z8LRVFMwJUoc_DPVUriSXTZ6PO9MaJ80PhRbKyB8,34
2
+ pychemstation/analysis/__init__.py,sha256=dcX7OeHoKdyrECHRCSXgKZN81nOXSAmZRxXzRT0jpDc,126
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=H6ilH0e3vhk0B6ZFi8ecomKSi144Qw-TLRwyL7XFB-o,12356
9
+ pychemstation/control/controllers/README.md,sha256=S5cd4NJmPjs6TUH98BtPJJhiS1Lu-mxLCNS786ogOrQ,32
10
+ pychemstation/control/controllers/__init__.py,sha256=GFVjjLxPL-FoRHxijdIkHggYvBqIQrnXaoGZgjuArdo,144
11
+ pychemstation/control/controllers/comm.py,sha256=XgEECwlrUMHaZoHSqbYqaA5Kkoy5RRRnyoI6Mv64DWM,8571
12
+ pychemstation/control/controllers/devices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ pychemstation/control/controllers/devices/device.py,sha256=ObcPeHFu4siRtt-XHllDgLruR1o8zWv1Gy0ar5bYgO4,2375
14
+ pychemstation/control/controllers/devices/injector.py,sha256=97xzayu0doxwtdfCgq-VI9rIHkZuGw65X1-JjIGQeFg,2798
15
+ pychemstation/control/controllers/tables/__init__.py,sha256=w-Zgbit10niOQfz780ZmRHjUFxV1hMkdui7fOMPqeLA,132
16
+ pychemstation/control/controllers/tables/method.py,sha256=8fwGcm8QRpayLnQ5q3Iyg2aaWWBY4SFT7_ZfJIxigZs,18208
17
+ pychemstation/control/controllers/tables/sequence.py,sha256=_u3YY2OrYub7jGvqRds5dmjqCB9pnWqTOI71MuGSMB0,15759
18
+ pychemstation/control/controllers/tables/table.py,sha256=qWjkh1S42FdUoN4PKgYg0yvar86QPDze9QRX_iHE6rk,13853
19
+ pychemstation/generated/__init__.py,sha256=xnEs0QTjeuGYO3tVUIy8GDo95GqTV1peEjosGckpOu0,977
20
+ pychemstation/generated/dad_method.py,sha256=xTUiSCvkXcxBUhjVm1YZKu-tHs16k23pF-0xYrQSwWA,8408
21
+ pychemstation/generated/pump_method.py,sha256=s3MckKDw2-nZUC5lHrJVvXYdneWP8-9UvblNuGryPHY,12092
22
+ pychemstation/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ pychemstation/utils/injector_types.py,sha256=lGgBZhWdh93hwYT4N9LLQuZXu4Xcuc3j0RDBzOWg8P8,836
24
+ pychemstation/utils/macro.py,sha256=Y_0CwTHcDQKoxYrNHqdF14-ciwtx56Y65SzNtOFPhNk,2848
25
+ pychemstation/utils/method_types.py,sha256=_2djFz_uWFc9aoZcyPMIjC5KYBs003WPoQGx7ZhMiOg,1649
26
+ pychemstation/utils/num_utils.py,sha256=dDs8sLZ_SdtvDKhyhF3IkljiVf16IYqpMTO5tEk9vMk,2079
27
+ pychemstation/utils/parsing.py,sha256=mzdpxrH5ux4-_i4CwZvnIYnIwAnRnOptKb3fZyYJcx0,9307
28
+ pychemstation/utils/pump_types.py,sha256=HWQHxscGn19NTrfYBwQRCO2VcYfwyko7YfBO5uDhEm4,93
29
+ pychemstation/utils/sequence_types.py,sha256=T0IP2iMqorUrdzH4at9Vsmmb3SCAEmN4z1cUlFaeTXw,1089
30
+ pychemstation/utils/spec_utils.py,sha256=lS27Xi4mFNDWBfmBqOoxTcVchPAkLK2mSdoaWDOfaPI,10211
31
+ pychemstation/utils/table_types.py,sha256=inOVpwSsic31VdVdJkfuq35QfKd7PoNoXY1QnOxZ6Sw,3235
32
+ pychemstation/utils/tray_types.py,sha256=9yLRIBn3IPVMbhrFqJQJ5gCQJI7H9DD2cdIFQDp2-8k,5184
33
+ pychemstation-0.10.5.dist-info/METADATA,sha256=RfxUkxoudjZSf-bxO4eSHpsqTxML-JQJYnAmBTr0wFQ,5933
34
+ pychemstation-0.10.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
35
+ pychemstation-0.10.5.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
36
+ pychemstation-0.10.5.dist-info/RECORD,,
@@ -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
@@ -1,37 +0,0 @@
1
- pychemstation/__init__.py,sha256=Sc4z8LRVFMwJUoc_DPVUriSXTZ6PO9MaJ80PhRbKyB8,34
2
- pychemstation/analysis/__init__.py,sha256=dcX7OeHoKdyrECHRCSXgKZN81nOXSAmZRxXzRT0jpDc,126
3
- pychemstation/analysis/base_spectrum.py,sha256=t_VoxAtBph1V7S4fOsziERHiOBkYP0_nH7LTwbTEvcE,16529
4
- pychemstation/analysis/chromatogram.py,sha256=cBfLh58PrBZMg9-u5o_Q-FCuu3MlB0q0ZFm9_2uaciU,3270
5
- pychemstation/analysis/process_report.py,sha256=mUBuMHFNNUa-dP0-OZse9XcDahMNX84cCz705Eg6T3A,12250
6
- pychemstation/control/README.md,sha256=_7ITj4hD17YIwci6UY6xBebC9gPCBpzBFTB_Gx0eJBc,3124
7
- pychemstation/control/__init__.py,sha256=uzfsVAGDhMP6SyV10KAH264ytDLMsMRZXRK5XhWS-rc,102
8
- pychemstation/control/hplc.py,sha256=mV-IO-6wdzB7MuV5LcZYwb4yZibBgEKX2LtbJ9WiKNw,12304
9
- pychemstation/control/controllers/README.md,sha256=S5cd4NJmPjs6TUH98BtPJJhiS1Lu-mxLCNS786ogOrQ,32
10
- pychemstation/control/controllers/__init__.py,sha256=XXTKee3bQpDJ2EO0k-ekJoZuq1h6WeO_DsOafxkBgTo,247
11
- pychemstation/control/controllers/comm.py,sha256=64VXS0C3BHTKCjuYCadmmxKWiVvMqtZebzyCOJifyUA,7994
12
- pychemstation/control/controllers/devices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- pychemstation/control/controllers/devices/device.py,sha256=XYOTehPYapL40GmcrtkRtdaZU2yvS4KwkLPRs9RB04U,1492
14
- pychemstation/control/controllers/devices/injector.py,sha256=C8HOxV2s1jvgum57DQ-bRTbJmb644TmZmGybxEoNN3Y,2109
15
- pychemstation/control/controllers/tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- pychemstation/control/controllers/tables/method.py,sha256=SDchncXgoFmzE9MLdVFTKs1-2Mx1EflG8pj5ALiq7Ck,19837
17
- pychemstation/control/controllers/tables/ms.py,sha256=ywrSa60H_5de32jxL2U5n464dIS_NXCC1M89mSiq-fY,723
18
- pychemstation/control/controllers/tables/sequence.py,sha256=SCLPj0c3kU9yApBGM7UbwzaJ5-NgRUj1SPZzSqV4f9Y,14175
19
- pychemstation/control/controllers/tables/table.py,sha256=OGpCS_FKsvl1WNWWWk6ooX1TGNHrGroTjlGqNPE6YNM,12632
20
- pychemstation/generated/__init__.py,sha256=xnEs0QTjeuGYO3tVUIy8GDo95GqTV1peEjosGckpOu0,977
21
- pychemstation/generated/dad_method.py,sha256=xTUiSCvkXcxBUhjVm1YZKu-tHs16k23pF-0xYrQSwWA,8408
22
- pychemstation/generated/pump_method.py,sha256=s3MckKDw2-nZUC5lHrJVvXYdneWP8-9UvblNuGryPHY,12092
23
- pychemstation/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- pychemstation/utils/injector_types.py,sha256=PXwJK1uXs8hlQ6dWIEbAGfk2BpQJQmN3SlUbL4ntZz0,822
25
- pychemstation/utils/macro.py,sha256=0Kd86_xDB_99R5qcnCpD-FEm1mdGuPMuCaFoYIUkfhc,2937
26
- pychemstation/utils/method_types.py,sha256=dRf12UaWerqPkycFq4nNXZk6HnOKq0ZIyROIuKDKiSI,1639
27
- pychemstation/utils/num_utils.py,sha256=dDs8sLZ_SdtvDKhyhF3IkljiVf16IYqpMTO5tEk9vMk,2079
28
- pychemstation/utils/parsing.py,sha256=mzdpxrH5ux4-_i4CwZvnIYnIwAnRnOptKb3fZyYJcx0,9307
29
- pychemstation/utils/pump_types.py,sha256=HWQHxscGn19NTrfYBwQRCO2VcYfwyko7YfBO5uDhEm4,93
30
- pychemstation/utils/sequence_types.py,sha256=T0IP2iMqorUrdzH4at9Vsmmb3SCAEmN4z1cUlFaeTXw,1089
31
- pychemstation/utils/spec_utils.py,sha256=lS27Xi4mFNDWBfmBqOoxTcVchPAkLK2mSdoaWDOfaPI,10211
32
- pychemstation/utils/table_types.py,sha256=inOVpwSsic31VdVdJkfuq35QfKd7PoNoXY1QnOxZ6Sw,3235
33
- pychemstation/utils/tray_types.py,sha256=9yLRIBn3IPVMbhrFqJQJ5gCQJI7H9DD2cdIFQDp2-8k,5184
34
- pychemstation-0.10.4.dist-info/METADATA,sha256=yXiZCbNWNQmNV4FN1cyMTBRkFtjIzll3KAJE1XnOVTE,5875
35
- pychemstation-0.10.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
36
- pychemstation-0.10.4.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
37
- pychemstation-0.10.4.dist-info/RECORD,,