pychemstation 0.10.6__py3-none-any.whl → 0.10.7.dev1__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 (31) hide show
  1. pychemstation/analysis/base_spectrum.py +14 -15
  2. pychemstation/analysis/chromatogram.py +7 -8
  3. pychemstation/analysis/process_report.py +7 -15
  4. pychemstation/control/README.md +2 -2
  5. pychemstation/control/controllers/__init__.py +2 -1
  6. pychemstation/control/controllers/comm.py +40 -13
  7. pychemstation/control/controllers/data_aq/method.py +19 -22
  8. pychemstation/control/controllers/data_aq/sequence.py +129 -111
  9. pychemstation/control/controllers/devices/injector.py +7 -7
  10. pychemstation/control/hplc.py +57 -60
  11. pychemstation/utils/__init__.py +23 -0
  12. pychemstation/utils/{mocking → abc_tables}/abc_comm.py +8 -14
  13. pychemstation/utils/abc_tables/device.py +27 -0
  14. pychemstation/{control/controllers → utils}/abc_tables/run.py +69 -34
  15. pychemstation/{control/controllers → utils}/abc_tables/table.py +29 -22
  16. pychemstation/utils/macro.py +13 -0
  17. pychemstation/utils/method_types.py +12 -13
  18. pychemstation/utils/mocking/mock_comm.py +1 -1
  19. pychemstation/utils/num_utils.py +3 -3
  20. pychemstation/utils/sequence_types.py +30 -12
  21. pychemstation/utils/spec_utils.py +42 -66
  22. pychemstation/utils/table_types.py +13 -2
  23. pychemstation/utils/tray_types.py +28 -16
  24. {pychemstation-0.10.6.dist-info → pychemstation-0.10.7.dev1.dist-info}/METADATA +2 -8
  25. pychemstation-0.10.7.dev1.dist-info/RECORD +41 -0
  26. pychemstation/control/controllers/abc_tables/device.py +0 -15
  27. pychemstation/utils/pump_types.py +0 -7
  28. pychemstation-0.10.6.dist-info/RECORD +0 -42
  29. /pychemstation/{control/controllers → utils}/abc_tables/__init__.py +0 -0
  30. {pychemstation-0.10.6.dist-info → pychemstation-0.10.7.dev1.dist-info}/WHEEL +0 -0
  31. {pychemstation-0.10.6.dist-info → pychemstation-0.10.7.dev1.dist-info}/licenses/LICENSE +0 -0
@@ -7,6 +7,8 @@ from typing import Union
7
7
 
8
8
  @dataclass
9
9
  class Response:
10
+ """Class representing a response from Chemstation"""
11
+
10
12
  string_response: str
11
13
  num_response: Union[int, float]
12
14
 
@@ -48,6 +50,17 @@ class Command(Enum):
48
50
  SAVE_METHOD_CMD = 'SaveMethod _MethPath$, _MethFile$, "{commit_msg}"'
49
51
  GET_SEQUENCE_CMD = "response$ = _SeqFile$"
50
52
  RUN_SEQUENCE_CMD = "RunSequence"
53
+ CURRENT_RUNNING_SEQ_LINE = "response_num = _SEQCURRLINE1"
54
+
55
+ # Get directories
56
+ GET_METHOD_DIR = "response$ = _METHPATH$"
57
+ GET_SEQUENCE_DIR = "response$ = _SEQUENCEPATHS$"
58
+ GET_DATA_DIRS = "response$ = _DATAPATHS$"
59
+ GET_CURRENT_RUN_DATA_DIR = "response$ = _DATAPath$"
60
+ GET_CURRENT_RUN_DATA_FILE = "response$ = _DATAFILE1$"
61
+
62
+ # Debuggng
63
+ ERROR = "response$ = _ERROR$"
51
64
 
52
65
 
53
66
  class HPLCRunningStatus(Enum):
@@ -4,8 +4,6 @@ from dataclasses import dataclass
4
4
  from enum import Enum
5
5
  from typing import Any, Optional, Union
6
6
 
7
- from ..generated import Signal
8
- from .injector_types import InjectorTable
9
7
  from .table_types import RegisterFlag
10
8
 
11
9
 
@@ -23,6 +21,8 @@ class Param:
23
21
 
24
22
  @dataclass
25
23
  class HPLCMethodParams:
24
+ """The starting conditions of a run that are displayed in the Chemstation GUI for the pump."""
25
+
26
26
  organic_modifier: float
27
27
  flow: float
28
28
  pressure: Optional[float] = None # TODO: find this
@@ -30,6 +30,8 @@ class HPLCMethodParams:
30
30
 
31
31
  @dataclass
32
32
  class TimeTableEntry:
33
+ """Row in a method timetable."""
34
+
33
35
  start_time: float
34
36
  organic_modifer: Optional[float]
35
37
  flow: Optional[float] = None
@@ -37,21 +39,18 @@ class TimeTableEntry:
37
39
 
38
40
  @dataclass
39
41
  class MethodDetails:
40
- """An Agilent Chemstation method, TODO is to add MS parameters, injector parameters
41
-
42
- :attribute name: the name of the method, should be the same as the Chemstation method name.
43
- :attribute timetable: list of entries in the method timetable
44
- :attribute stop_time: the time the method stops running after the last timetable entry.
45
- :attribute post_time: the amount of time after the stoptime that the pumps keep running,
46
- based on settings in the first row of the timetable.
47
- :attribute params: the organic modifier (pump B) and flow rate displayed for the method (the time 0 settings)
48
- :attribute dad_wavelengthes:
42
+ """An Agilent Chemstation method
43
+
44
+ :param name: the name of the method, should be the same as the Chemstation method name.
45
+ :param timetable: list of entries in the method timetable
46
+ :param stop_time: the time the method stops running after the last timetable entry. If `None`, won't be set.
47
+ :param post_time: the amount of time after the stoptime that the pumps keep running,
48
+ based on settings in the first row of the timetable. If `None`, won't be set.
49
+ :param params: the organic modifier (pump B) and flow rate displayed for the method (the time 0 settings)
49
50
  """
50
51
 
51
52
  name: str
52
53
  params: HPLCMethodParams
53
54
  timetable: list[TimeTableEntry]
54
- injector_program: Optional[InjectorTable] = None
55
55
  stop_time: Optional[float] = None
56
56
  post_time: Optional[float] = None
57
- dad_wavelengthes: Optional[list[Signal]] = None
@@ -1,4 +1,4 @@
1
- from pychemstation.utils.mocking.abc_comm import ABCCommunicationController
1
+ from ...control.controllers.abc_tables.abc_comm import ABCCommunicationController
2
2
 
3
3
 
4
4
  class MockCommunicationController(ABCCommunicationController):
@@ -18,7 +18,7 @@ def find_nearest_value_index(array, value) -> Tuple[float, int]:
18
18
  return array[index_], index_
19
19
 
20
20
 
21
- def interpolate_to_index(array, ids, precision: int = 100) -> np.array:
21
+ def interpolate_to_index(array, ids, precision: int = 100) -> np.ndarray:
22
22
  """Find value in between arrays elements.
23
23
 
24
24
  Constructs linspace of size "precision" between index+1 and index to
@@ -37,8 +37,8 @@ def interpolate_to_index(array, ids, precision: int = 100) -> np.array:
37
37
  :return: New array with interpolated values according to provided indexes "ids".
38
38
 
39
39
  Example:
40
- >>> interpolate_to_index(np.array([1.5]), np.array([1,2,3], 100))
41
- array([2.50505051])
40
+ >>> interpolate_to_index(np.array([1.5]), np.array([1, 2, 3], 100))
41
+ ... array([2.50505051])
42
42
  """
43
43
 
44
44
  # breaking ids into fractional and integral parts
@@ -9,8 +9,17 @@ from pychemstation.utils.tray_types import Tray
9
9
 
10
10
  @dataclass
11
11
  class SequenceDataFiles:
12
+ """Class to represent files generated during a sequence.
13
+
14
+ :param sequence_name: the name of the sequence that is running
15
+ :param dir: the complete path of the directory generated for the sequence
16
+ :param _data_files: the names of the files of the sequence runs, ends with ".D"
17
+ :param child_dirs: the complete path of the files for sequence runs, contains the Chemstation data, `dir` and the sample run file.
18
+ """
19
+
12
20
  sequence_name: str
13
21
  dir: str
22
+ _data_files: List[str] = field(default_factory=list)
14
23
  child_dirs: List[str] = field(default_factory=list)
15
24
 
16
25
 
@@ -38,9 +47,11 @@ class InjectionSource(Enum):
38
47
 
39
48
  @dataclass
40
49
  class SequenceEntry:
41
- sample_name: str
50
+ """Class to represent each row of a sequence file, maps one to one to Chemstation."""
51
+
52
+ data_file: str
42
53
  vial_location: Tray
43
- data_file: Optional[str] = None
54
+ sample_name: Optional[str] = None
44
55
  method: Optional[str] = None
45
56
  num_inj: Optional[int] = 1
46
57
  inj_vol: Optional[float] = 2
@@ -50,23 +61,30 @@ class SequenceEntry:
50
61
 
51
62
  @dataclass
52
63
  class SequenceTable:
64
+ """Class to represent a sequence file.
65
+
66
+ :param name: name of the sequence
67
+ :param rows: the entries
68
+ """
69
+
53
70
  name: str
54
71
  rows: list[SequenceEntry]
55
72
 
56
- def __eq__(self, other):
57
- equal = False
73
+ def __eq__(self, other) -> bool:
58
74
  if not isinstance(other, SequenceTable):
59
75
  return False
60
76
 
77
+ equal = True
61
78
  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 |= (
79
+ equal &= self_row.vial_location == other_row.vial_location
80
+ equal &= self_row.data_file == other_row.data_file
81
+ equal &= (
65
82
  os.path.split(os.path.normpath(self_row.method))[-1]
66
83
  == os.path.split(os.path.normpath(other_row.method))[-1]
67
84
  )
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
85
+ equal &= self_row.num_inj == other_row.num_inj
86
+ equal &= self_row.inj_vol == other_row.inj_vol
87
+ equal &= self_row.inj_source == other_row.inj_source
88
+ equal &= self_row.sample_name == other_row.sample_name
89
+ equal &= self_row.sample_type == other_row.sample_type
90
+ return equal
@@ -3,23 +3,22 @@ Module contains various utility function for spectral data processing and
3
3
  analysis.
4
4
  """
5
5
 
6
+ from typing import Optional
7
+
6
8
  import numpy as np
7
9
  import scipy
8
10
 
9
11
  from ..utils.num_utils import find_nearest_value_index
10
12
 
11
13
 
12
- def create_binary_peak_map(data):
14
+ def create_binary_peak_map(data: np.ndarray) -> np.ndarray:
13
15
  """Return binary map of the peaks within data points.
14
16
 
15
17
  True values are assigned to potential peak points, False - to baseline.
16
18
 
17
- Args:
18
- data (:obj:np.array): 1D array with data points.
19
+ :param data: 1D array with data points.
19
20
 
20
- Returns:
21
- :obj:np.array, dtype=bool: Mapping of data points, where True is
22
- potential peak region point, False - baseline.
21
+ :return: Mapping of data points, where True is potential peak region point, False - baseline.
23
22
  """
24
23
  # copying array
25
24
  data_c = np.copy(data)
@@ -47,21 +46,15 @@ def create_binary_peak_map(data):
47
46
  return peak_map
48
47
 
49
48
 
50
- def combine_map_to_regions(mapping):
49
+ def combine_map_to_regions(mapping: np.ndarray) -> np.ndarray:
51
50
  """Combine True values into their indexes arrays.
52
51
 
53
- Args:
54
- mapping (:obj:np.array): Boolean mapping array to extract the indexes
55
- from.
56
-
57
- Returns:
58
- :obj:np.array: 2D array with left and right borders of regions, where
59
- mapping is True.
52
+ :param mapping: Boolean mapping array to extract the indexes from.
53
+ :return: 2D array with left and right borders of regions, where mapping is True.
60
54
 
61
55
  Example:
62
- >>> combine_map_to_regions(np.array([True, True, False, True, False]))
63
- array([[0, 1],
64
- [3, 3]])
56
+ >>> combine_map_to_regions(np.array([True, True, False, True, False]))
57
+ ... array([[0, 1], [3, 3]])
65
58
  """
66
59
 
67
60
  # No peaks identified, i.e. mapping is all False
@@ -94,23 +87,17 @@ def combine_map_to_regions(mapping):
94
87
  return np.hstack((lefts, rights))
95
88
 
96
89
 
97
- def filter_regions(x_data, peaks_regions):
90
+ def filter_regions(x_data: np.ndarray, peaks_regions: np.ndarray) -> np.ndarray:
98
91
  """Filter peak regions.
99
92
 
100
93
  Peak regions are filtered to remove potential false positives (e.g. noise
101
94
  spikes).
102
95
 
103
- Args:
104
- x_data (:obj:np.array): X data points, needed to pick up the data
105
- resolution and map the region indexes to the corresponding data
96
+ :param x_data: X data points, needed to pick up the data resolution and map the region indexes to the corresponding data
106
97
  points.
107
- y_data (:obj:np.array): Y data points, needed to validate if the peaks
108
- are actually present in the region and remove invalid regions.
109
- peaks_regions (:obj:np.array): 2D Nx2 array with peak regions indexes
110
- (rows) as left and right borders (columns).
98
+ :param peaks_regions: 2D Nx2 array with peak regions indexes (rows) as left and right borders (columns).
111
99
 
112
- Returns:
113
- :obj:np.array: 2D Mx2 array with filtered peak regions indexes(rows) as
100
+ :return: 2D Mx2 array with filtered peak regions indexes(rows) as
114
101
  left and right borders (columns).
115
102
  """
116
103
 
@@ -134,21 +121,19 @@ def filter_regions(x_data, peaks_regions):
134
121
  return peaks_regions
135
122
 
136
123
 
137
- def filter_noisy_regions(y_data, peaks_regions):
124
+ def filter_noisy_regions(y_data: np.ndarray, peaks_regions: np.ndarray) -> np.ndarray:
138
125
  """Remove noisy regions from given regions array.
139
126
 
140
127
  Peak regions are filtered to remove false positive noise regions, e.g.
141
128
  incorrectly assigned due to curvy baseline. Filtering is performed by
142
129
  computing average peak points/data points ratio.
143
130
 
144
- Args:
145
- y_data (:obj:np.array): Y data points, needed to validate if the peaks
131
+ :param y_data: Y data points, needed to validate if the peaks
146
132
  are actually present in the region and remove invalid regions.
147
- peaks_regions (:obj:np.array): 2D Nx2 array with peak regions indexes
133
+ :param peaks_regions: 2D Nx2 array with peak regions indexes
148
134
  (rows) as left and right borders (columns).
149
135
 
150
- Returns:
151
- :obj:np.array: 2D Mx2 array with filtered peak regions indexes(rows) as
136
+ :return: 2D Mx2 array with filtered peak regions indexes(rows) as
152
137
  left and right borders (columns).
153
138
  """
154
139
 
@@ -198,42 +183,35 @@ def filter_noisy_regions(y_data, peaks_regions):
198
183
  return peaks_regions
199
184
 
200
185
 
201
- def merge_regions(x_data, peaks_regions, d_merge, recursively=True):
186
+ def merge_regions(
187
+ x_data: np.ndarray,
188
+ peaks_regions: np.ndarray,
189
+ d_merge: float,
190
+ recursively: Optional[bool] = True,
191
+ ):
202
192
  """Merge peak regions if distance between is less than delta.
203
193
 
204
- Args:
205
- x_data (:obj:np.array): X data points.
206
- peaks_regions (:obj:np.array): 2D Nx2 array with peak regions indexes
194
+ :param x_data: X data points.
195
+ :param peaks_regions: 2D Nx2 array with peak regions indexes
207
196
  (rows) as left and right borders (columns).
208
- d_merge (float): Minimum distance in X data points to merge two or more
197
+ :param d_merge: Minimum distance in X data points to merge two or more
209
198
  regions together.
210
- recursively (bool, optional): If True - will repeat the procedure until
199
+ :param recursively: If True - will repeat the procedure until
211
200
  all regions with distance < than d_merge will merge.
212
201
 
213
- Returns:
214
- :obj:np.array: 2D Mx2 array with peak regions indexes (rows) as left and
202
+ :return: 2D Mx2 array with peak regions indexes (rows) as left and
215
203
  right borders (columns), merged according to predefined minimal
216
204
  distance.
217
205
 
218
206
  Example:
219
- >>> regions = np.array([
220
- [1, 10],
221
- [11, 20],
222
- [25, 45],
223
- [50, 75],
224
- [100, 120],
225
- [122, 134]
226
- ])
227
- >>> data = np.ones_like(regions) # ones as example
228
- >>> merge_regions(data, regions, 1)
229
- array([[ 1, 20],
230
- [ 25, 45],
231
- [ 50, 75],
232
- [100, 120],
233
- [122, 134]])
234
- >>> merge_regions(data, regions, 20, True)
235
- array([[ 1, 75],
236
- [100, 134]])
207
+ >>> regions = np.array(
208
+ ... [[1, 10], [11, 20], [25, 45], [50, 75], [100, 120], [122, 134]]
209
+ ... )
210
+ >>> data = np.ones_like(regions) # ones as example
211
+ >>> merge_regions(data, regions, 1)
212
+ ... array([[1, 20], [ 25, 45], [ 50, 75], [100, 120], [122, 134]])
213
+ >>> merge_regions(data, regions, 20, True)
214
+ ... array([[1, 75], [100, 134]])
237
215
  """
238
216
  # the code is pretty ugly but works
239
217
  merged_regions = []
@@ -269,17 +247,15 @@ def merge_regions(x_data, peaks_regions, d_merge, recursively=True):
269
247
  return merge_regions(x_data, merged_regions, d_merge, recursively=True)
270
248
 
271
249
 
272
- def expand_regions(x_data, peaks_regions, d_expand):
250
+ def expand_regions(x_data: np.ndarray, peaks_regions: np.ndarray, d_expand: float):
273
251
  """Expand the peak regions by the desired value.
274
252
 
275
- Args:
276
- x_data (:obj:np.array): X data points.
277
- peaks_regions (:obj:np.array): 2D Nx2 array with peak regions indexes
253
+ :param x_data: X data points.
254
+ :param peaks_regions: 2D Nx2 array with peak regions indexes
278
255
  (rows) as left and right borders (columns).
279
- d_expand (float): Value to expand borders to (in X data scale).
256
+ :param d_expand: Value to expand borders to (in X data scale).
280
257
 
281
- Returns:
282
- :obj:np.array: 2D Nx2 array with expanded peak regions indexes (rows) as
258
+ :return: 2D Nx2 array with expanded peak regions indexes (rows) as
283
259
  left and right borders (columns).
284
260
  """
285
261
 
@@ -6,6 +6,10 @@ from typing import TypeVar
6
6
 
7
7
 
8
8
  class TableOperation(Enum):
9
+ """
10
+ MACROS related to editing and reading tables in Chemstation.
11
+ """
12
+
9
13
  def __str__(self):
10
14
  return "%s" % self.value
11
15
 
@@ -29,6 +33,10 @@ class TableOperation(Enum):
29
33
 
30
34
 
31
35
  class RegisterFlag(Enum):
36
+ """
37
+ Flags for accessing Chemstation parameters.
38
+ """
39
+
32
40
  def __str__(self):
33
41
  return "%s" % self.value
34
42
 
@@ -42,7 +50,7 @@ class RegisterFlag(Enum):
42
50
  SOLVENT_D_COMPOSITION = "PumpChannel4_CompositionPercentage"
43
51
  FLOW = "Flow"
44
52
  MAX_TIME = "StopTime_Time"
45
- POST_TIME = "PostTime_Time" # TODO: check
53
+ POST_TIME = "PostTime_Time"
46
54
  SIGNAL_A = "Signal_Wavelength"
47
55
  SIGNAL_B = "Signal2_Wavelength"
48
56
  SIGNAL_C = "Signal3_Wavelength"
@@ -79,7 +87,6 @@ class RegisterFlag(Enum):
79
87
  DRAW_VOLUME = "DrawVolume_Mode"
80
88
  DRAW_SPEED = "DrawSpeed_Mode"
81
89
  DRAW_OFFSET = "DrawOffset_Mode"
82
- # SetObjHdrVal RCWLS1Pretreatment[1], "DrawVolume_Value", 1
83
90
  DRAW_VOLUME_VALUE = "DrawVolume_Value"
84
91
  DRAW_LOCATION = "DrawLocation"
85
92
  DRAW_LOCATION_TRAY = "DrawLocationPlus_Tray"
@@ -95,6 +102,10 @@ class RegisterFlag(Enum):
95
102
 
96
103
  @dataclass
97
104
  class Table:
105
+ """
106
+ Class for storing the keys needed to access certain register tables.
107
+ """
108
+
98
109
  register: str
99
110
  name: str
100
111
 
@@ -90,14 +90,16 @@ class Letter(Enum):
90
90
 
91
91
  @dataclass
92
92
  class FiftyFourVialPlate:
93
- """
94
- Class to represent the 54 vial tray. Assumes you have:
95
- 2 plates (P1 or P2)
96
- 6 rows (A B C D E F)
97
- 9 columns (1 2 3 4 5 6 7 8 9)
93
+ """Class to represent the 54 vial tray.
94
+
95
+ :param plate: one of the two, (P1 or P2)
96
+ :param letter: one of the rows, (A B C D E F)
97
+ :param num: one of the columns, (1 2 3 4 5 6 7 8 9)
98
98
 
99
- valid vial locations: P1-A2, P2-F9
100
- invalid vial locations: P3-A1, P1-Z3, P2-B10
99
+ Examples:
100
+ >>> from pychemstation.utils.tray_types import FiftyFourVialPlate
101
+ >>> FiftyFourVialPlate.from_str("P1-A2")
102
+ >>> FiftyFourVialPlate(plate=Plate.TWO, letter=Letter.A, num=Num.THREE)
101
103
  """
102
104
 
103
105
  plate: Plate
@@ -120,12 +122,15 @@ class FiftyFourVialPlate:
120
122
 
121
123
  @classmethod
122
124
  def from_str(cls, loc: str):
123
- """
124
- Converts a string representing the vial location into numerical representation for Chemstation.
125
+ """Converts a string representing the vial location into numerical representation for Chemstation.
125
126
 
126
127
  :param loc: vial location
127
128
  :return: `FiftyFourVialPlate` object representing the vial location
128
129
  :raises: ValueError if string is invalid tray location
130
+
131
+ Examples:
132
+ >>> from pychemstation.utils.tray_types import FiftyFourVialPlate
133
+ >>> vial_location = FiftyFourVialPlate.from_str("P2-F4")
129
134
  """
130
135
  if len(loc) != 5:
131
136
  raise ValueError(
@@ -147,15 +152,17 @@ class FiftyFourVialPlate:
147
152
 
148
153
  @classmethod
149
154
  def from_int(cls, num: int) -> Tray:
150
- """
151
- Converts an integer representation of a vial location to a `FiftyFourVialPlate` or `TenVialColumn` object
155
+ """Converts an integer representation of a vial location to a `FiftyFourVialPlate` object
152
156
 
153
157
  :param num: numerical representation of a vial location
154
158
  :return: the proper vial location object
155
159
  :raises: ValueError no matching can be made
160
+
161
+ Examples:
162
+ >>> vial_location = FiftyFourVialPlate.from_int(4097)
156
163
  """
157
164
  if num in range(1, 11):
158
- return TenVialColumn(num)
165
+ return VialBar(num)
159
166
 
160
167
  row_starts = [
161
168
  # plate 1
@@ -200,9 +207,12 @@ class FiftyFourVialPlate:
200
207
  raise ValueError("Number didn't match any location. " + str(num))
201
208
 
202
209
 
203
- class TenVialColumn(Enum):
204
- """
205
- Class to represent the 10 vial locations.
210
+ class VialBar(Enum):
211
+ """Class to represent the vial bar, has 10 locations.
212
+
213
+ Examples:
214
+ >>> vial_bar_2 = VialBar(2)
215
+ >>> vial_bar_10 = VialBar.TEN
206
216
  """
207
217
 
208
218
  ONE = 1
@@ -219,10 +229,12 @@ class TenVialColumn(Enum):
219
229
 
220
230
  @dataclass
221
231
  class LocationPlus:
232
+ """Not sure what location refers to, but part the `Draw` function for specifying an `InjectorTable`"""
233
+
222
234
  unit: int
223
235
  tray: int
224
236
  row: int
225
237
  col: int
226
238
 
227
239
 
228
- Tray = Union[FiftyFourVialPlate, TenVialColumn, LocationPlus]
240
+ Tray = Union[FiftyFourVialPlate, VialBar, LocationPlus]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pychemstation
3
- Version: 0.10.6
3
+ Version: 0.10.7.dev1
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
@@ -13,19 +13,13 @@ Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Requires-Python: >=3.10
15
15
  Requires-Dist: aghplctools==4.8.6
16
- Requires-Dist: coverage>=7.6.1
17
16
  Requires-Dist: matplotlib>=3.7.5
18
17
  Requires-Dist: pandas>=2.0.3
19
18
  Requires-Dist: pdoc>=14.7.0
20
19
  Requires-Dist: polling>=0.3.2
21
- Requires-Dist: pre-commit>=4.2.0
22
- Requires-Dist: pytest>=7.3.5
23
20
  Requires-Dist: rainbow-api>=1.0.10
24
21
  Requires-Dist: result>=0.17.0
25
22
  Requires-Dist: scipy>=1.10.1
26
- Requires-Dist: seabreeze>=2.9.2
27
- Requires-Dist: setuptools>=75.3.2
28
- Requires-Dist: twine>=6.1.0
29
23
  Requires-Dist: xsdata>=24.9
30
24
  Description-Content-Type: text/markdown
31
25
 
@@ -90,7 +84,7 @@ DATA_DIR_2 = "C:\\Users\\Public\\Documents\\ChemStation\\2\\Data"
90
84
  DATA_DIR_3 = "C:\\Users\\Public\\Documents\\ChemStation\\3\\Data"
91
85
 
92
86
  # Initialize HPLC Controller
93
- hplc_controller = HPLCController(data_dirs=[DATA_DIR_2, DATA_DIR_3],
87
+ hplc_controller = HPLCController(extra_data_dirs=[DATA_DIR_2, DATA_DIR_3],
94
88
  comm_dir=DEFAULT_COMMAND_PATH,
95
89
  method_dir=DEFAULT_METHOD_DIR,
96
90
  sequence_dir=SEQUENCE_DIR)
@@ -0,0 +1,41 @@
1
+ pychemstation/__init__.py,sha256=Sc4z8LRVFMwJUoc_DPVUriSXTZ6PO9MaJ80PhRbKyB8,34
2
+ pychemstation/analysis/__init__.py,sha256=mPNnp0TmkoUxrTGcT6wNKMyCiOar5vC0cTPmFLrDU1Q,313
3
+ pychemstation/analysis/base_spectrum.py,sha256=HjbTPoueR7XB1_puCcmx7zbQmeT5SH6_HVwHrYhNXhA,16537
4
+ pychemstation/analysis/chromatogram.py,sha256=Jk6xOMHA6kSV597fJDZgrFRlvVorldvK4zerPASZrug,3969
5
+ pychemstation/analysis/process_report.py,sha256=aTsW6u5-0iwsH3jQtkoKE9jbsy5NAUG6l7O-I49B8kY,14650
6
+ pychemstation/control/README.md,sha256=ohPn3xhgjFyPraQqR4x9aZhurQVAOYuYHv-E8sj0eK4,3124
7
+ pychemstation/control/__init__.py,sha256=7lSkY7Qa7Ikdz82-2FESc_oqktv7JndsjltCkiMqnMI,147
8
+ pychemstation/control/hplc.py,sha256=Evmo_D6X2RDmPBFmo3vsKE9kxJzy36Ptz4MyF2IKNzA,13146
9
+ pychemstation/control/controllers/README.md,sha256=S5cd4NJmPjs6TUH98BtPJJhiS1Lu-mxLCNS786ogOrQ,32
10
+ pychemstation/control/controllers/__init__.py,sha256=q2TUEie3J-OLlxcGLkG7vIy8fazCEhHm61OGzJPbhD0,179
11
+ pychemstation/control/controllers/comm.py,sha256=jdKl9Islwk5tq2h1esm_-8gR4r4xZre0Ma5fMBqRzW4,6660
12
+ pychemstation/control/controllers/data_aq/__init__.py,sha256=w-Zgbit10niOQfz780ZmRHjUFxV1hMkdui7fOMPqeLA,132
13
+ pychemstation/control/controllers/data_aq/method.py,sha256=oxRT3kSjyrDzpS01HgtT9IvGkhq_wHQ_6_63maNhVio,18249
14
+ pychemstation/control/controllers/data_aq/sequence.py,sha256=zhilGZXUEttqrux8OI2ieAWktINsrD98fm_b6guZKlo,17209
15
+ pychemstation/control/controllers/devices/__init__.py,sha256=QpgGnLXyWiB96KIB98wMccEi8oOUUaLxvBCyevJzcOg,75
16
+ pychemstation/control/controllers/devices/injector.py,sha256=LyubM-fqf5ruseGx32deTDK-yevmaTOvdo6YKg2PF7I,4029
17
+ pychemstation/generated/__init__.py,sha256=xnEs0QTjeuGYO3tVUIy8GDo95GqTV1peEjosGckpOu0,977
18
+ pychemstation/generated/dad_method.py,sha256=xTUiSCvkXcxBUhjVm1YZKu-tHs16k23pF-0xYrQSwWA,8408
19
+ pychemstation/generated/pump_method.py,sha256=s3MckKDw2-nZUC5lHrJVvXYdneWP8-9UvblNuGryPHY,12092
20
+ pychemstation/utils/__init__.py,sha256=GZJyDzkhzrlMguxZTUpgthq72pA3YV23DJIR2Q63PCk,449
21
+ pychemstation/utils/injector_types.py,sha256=z2iWwTklGm0GRDCL9pnPCovQrwyRwxv8w5w5Xh7Pj3U,1152
22
+ pychemstation/utils/macro.py,sha256=n2CcvB7MY4fl8Ds909K41aqqH7_6DlKK5R4aemLhOdM,3300
23
+ pychemstation/utils/method_types.py,sha256=pXfZWmIPnZu3kIdGPxSPJMhL4WSt-u00If1JDUaLaMQ,1555
24
+ pychemstation/utils/num_utils.py,sha256=OpqZwMPoxTYkpjpinA1CcoQAXDY_0sie6d-hTU547uo,2087
25
+ pychemstation/utils/parsing.py,sha256=mzdpxrH5ux4-_i4CwZvnIYnIwAnRnOptKb3fZyYJcx0,9307
26
+ pychemstation/utils/sequence_types.py,sha256=XBK9FCWgTstmquSL69sQHk4oKb5dimmB-RWvwxU3RV4,2655
27
+ pychemstation/utils/spec_utils.py,sha256=BtXgQndZy4kVKsrgEDxwNd0HctypnAt5upB9SOk1D9w,9700
28
+ pychemstation/utils/table_types.py,sha256=obQrnwDNmy-7r1IDD3N6wY7gUPKfpcM6D9Ow0IN-T48,3609
29
+ pychemstation/utils/tray_types.py,sha256=UeHM0hUYaNc9giT96ZiGpyWBPQwG-SyLA0rVGzDDAJk,6618
30
+ pychemstation/utils/abc_tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ pychemstation/utils/abc_tables/abc_comm.py,sha256=rTrnfyTdqRSiBfBW1_460KsHER5vpfhv7JYwObBgBZc,5501
32
+ pychemstation/utils/abc_tables/device.py,sha256=v8MNFvymbKe4hWsqzO6Z_qsVvju_rISYtnPgaftecyE,919
33
+ pychemstation/utils/abc_tables/run.py,sha256=FPwGuWIS4BLTS-aZqBLWoHvgev4qsAnUdPVjVPnFWVU,9842
34
+ pychemstation/utils/abc_tables/table.py,sha256=4mfmegCdMppxgpxVDt7oULoxTBVia8_JTxYPjlWq8VE,7743
35
+ pychemstation/utils/mocking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ pychemstation/utils/mocking/mock_comm.py,sha256=4DcKmUxp-LYNXjywT_za1_GpqKa4sFTj7F2V3r_qsA0,156
37
+ pychemstation/utils/mocking/mock_hplc.py,sha256=Hx6127C7d3miYGCZYxbN-Q3PU8kpMgXYX2n6we2Twgw,25
38
+ pychemstation-0.10.7.dev1.dist-info/METADATA,sha256=4q5zU2Ys8DnagN8Jqi-AFj8Updt1JxCDGAr-g3L9peQ,5757
39
+ pychemstation-0.10.7.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
40
+ pychemstation-0.10.7.dev1.dist-info/licenses/LICENSE,sha256=9bdF75gIf1MecZ7oymqWgJREVz7McXPG-mjqrTmzzD8,18658
41
+ pychemstation-0.10.7.dev1.dist-info/RECORD,,
@@ -1,15 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC
4
-
5
- from ....control.controllers import CommunicationController
6
- from ....utils.table_types import Table
7
- from .table import ABCTableController
8
-
9
-
10
- class DeviceController(ABCTableController, ABC):
11
- def __init__(
12
- self, controller: CommunicationController, table: Table, offline: bool
13
- ):
14
- super().__init__(controller=controller, table=table)
15
- self.offline = offline
@@ -1,7 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
-
4
- @dataclass
5
- class Pump:
6
- solvent: str
7
- in_use: bool